在后台运行的Service能不能自己接收广播消息?

xqhrs232 2011-03-14 03:21:01
在后台运行的Service能不能自己接收广播消息?
...全文
1271 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
如下用语句注册才是可以的



package com.demo;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.gsm.SmsMessage;

public class ListenService extends Service {
public static final String SvrId = "RARNU.SERVICE.DEMO";
public static final String strACT = "android.provider.Telephony.SMS_RECEIVED";
private SMSMsgReceiver recv;
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onCreate() {
IntentFilter filter = new IntentFilter(strACT);
recv = new SMSMsgReceiver();
registerReceiver(recv, filter);
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
unregisterReceiver(recv);
super.onDestroy();
}
public class SMSMsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(strACT)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
sb.append("From:");
sb.append(currMsg.getDisplayOriginatingAddress());
sb.append("\nMessage:");
sb.append(currMsg.getDisplayMessageBody());
}
}
Intent i = new Intent(SvrId);
i.putExtra("PARAM", sb.toString());
sendBroadcast(i);
}
}
}
}




qthsrs232 2011-03-15
  • 打赏
  • 举报
回复
Android下实现程序关闭后,监听取消
http://www.cnblogs.com/tt_mc/archive/2010/03/03/1677474.html
xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
android-轻松监听来电和去电
http://www.devdiv.com/article-1645-1.html


要监听android打电话和接电话,只需下面2步骤
1.第一步,写一个Receiver继承自BroadcastReceiver
public class PhoneStatReceiver extends BroadcastReceiver{

private static final String TAG = "PhoneStatReceiver";

// private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();

private static boolean incomingFlag = false;

private static String incoming_number = null;

@Override
public void onReceive(Context context, Intent intent) {
//如果是拨打电话
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
incomingFlag = false;
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:"+phoneNumber);
}else{
//如果是来电
TelephonyManager tm =
(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);

switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;//标识当前是来电
incoming_number = intent.getStringExtra("incoming_number");
Log.i(TAG, "RINGING :"+ incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if(incomingFlag){
Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
}
break;

case TelephonyManager.CALL_STATE_IDLE:
if(incomingFlag){
Log.i(TAG, "incoming IDLE");
}
break;
}
}
}
}

第二步:在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。
<receiver android:name=".filter.PhoneStatReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>


xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
不知道是不是因为在XML文件里面的放的分支不对还是什么其它。
xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ameyume 的回复:]
引用 7 楼 xqhrs232 的回复:
引用 5 楼 ameyume 的回复:
完全可以,例如在播放音乐的service类MusicService中实现监听电话广播的类PhoneStatReceiver
manifest写法如下:
<receiver android:name=".MusicService$PhoneStatReceiver">
...
</receiver>

……
[/Quote]
试了一下不行啊!!!



E/AndroidRuntime( 1216): java.lang.RuntimeException: Unable to instantiate receiver com.KT.MAP100_MainService.MainService$myBroadcastReceiver: java.lang.InstantiationException: com.KT.MAP100_MainService.MainService$myBroadcastReceiver
E/AndroidRuntime( 1216): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2520)
E/AndroidRuntime( 1216): at android.app.ActivityThread.access$3000(ActivityThread.java:116)
E/AndroidRuntime( 1216): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1843)
E/AndroidRuntime( 1216): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1216): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1216): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 1216): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1216): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1216): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 1216): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 1216): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1216): Caused by: java.lang.InstantiationException: com.KT.MAP100_MainService.MainService$myBroadcastReceiver
E/AndroidRuntime( 1216): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 1216): at java.lang.Class.newInstance(Class.java:1472)
E/AndroidRuntime( 1216): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2513)
E/AndroidRuntime( 1216): ... 10 more


ameyume 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xqhrs232 的回复:]
引用 5 楼 ameyume 的回复:
完全可以,例如在播放音乐的service类MusicService中实现监听电话广播的类PhoneStatReceiver
manifest写法如下:
<receiver android:name=".MusicService$PhoneStatReceiver">
...
</receiver>


你这个是不是要求PhoneStatRec……
[/Quote]
是内部类,从.MusicService$PhoneStatReceiver就可以看出来。
xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ameyume 的回复:]
完全可以,例如在播放音乐的service类MusicService中实现监听电话广播的类PhoneStatReceiver
manifest写法如下:
<receiver android:name=".MusicService$PhoneStatReceiver">
...
</receiver>
[/Quote]

你这个是不是要求PhoneStatReceiver类为MusicService类的内部类?
xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ameyume 的回复:]
完全可以,例如在播放音乐的service类MusicService中实现监听电话广播的类PhoneStatReceiver
manifest写法如下:
<receiver android:name=".MusicService$PhoneStatReceiver">
...
</receiver>
[/Quote]

我这样试一下看看!!!
ameyume 2011-03-14
  • 打赏
  • 举报
回复
完全可以,例如在播放音乐的service类MusicService中实现监听电话广播的类PhoneStatReceiver
manifest写法如下:
<receiver android:name=".MusicService$PhoneStatReceiver">
...
</receiver>
xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ultrapro 的回复:]
肯定是可以的,需要做个BroadcastReceiver
[/Quote]

我看到很多例子都是不行的啊!都是有ACTIVITY的参与。如果可以在工程的XML文件中RECIVER指定给谁?ACTIVITY吗?那不还是由ACTIVITY接收的?
Sodino 2011-03-14
  • 打赏
  • 举报
回复
可以的
儿大不由爷 2011-03-14
  • 打赏
  • 举报
回复
肯定是可以的,需要做个BroadcastReceiver
xqhrs232 2011-03-14
  • 打赏
  • 举报
回复
SERVICE可以自己发广播消息,也可以提供接口(IBINDER机制)被ACTIVITY调用,但不知道它自己能不能接手广播消息而不要ACTIVITY的参与。

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧