关于android上的broadcast和service的有关问题请问
关于android下的broadcast和service的问题请教
android下的broadcast机制,注册方式有动态和静态2种注册方式。
在应用中:
静态注册(通过androidmanifest中注册)的特点是可以由系统自动注销,而动态注册(在代码中注册)的则要调用注销函数来注销。
在framework中,添加一个广播我认为也是应该有这2种方式的。不过我不知道怎么使用静态方法注册(主要原因是不知道在哪里找那个XML文件,和怎么配XML文件)。在framework中动态添加一个广播(例如在powermangerservice.java 文件中添加了一个广播),在这个广播的onreceive函数中处理了一个较耗时间的事件(网友说onreceive的生存周期是10秒左右)。我通过一个应用发送了这个广播消息,广播收到消息执行了onreceive函数,运行的情况是:耗时的事件可以处理完成,但是会有错误LOG出现;但是按照网友的说法如果在onreceive里面处理了耗时的事件可能会导致ANR(可是这里没有出现ANR),我的广播在service里面,处理了耗时的事件,出现的仅仅是说我没有调用注销函数。
E/ActivityThread( 561): Activity com.android.launcher2.Launcher has leaked IntentReceiver com.android.launcher2.Launcher$1@213519a8 that was originally registered here. Are you missing a call to unregisterReceiver()?
没有调用unregisterReceiver()函数的原因是我希望这个广播可以重复的接收消息不希望注销掉,广播注册是在powermanagerservice初始化的时候做的。我试过在onreceive()函数中调用unregisterReceiver()函数注销掉广播,这样做了后,导致这个广播无法接受下一个广播消息了。
我想知道,我这想搞一个长期接收消息的广播该怎么做才可以,不注销广播是可以长期接收但是XT报错有是为什么,该怎么解决?关于广播的onreceive函数为什么不可以处理复杂的逻辑或者耗时的任务?在framework中注册广播(2个方法)怎么操作?
看网络资料说可以在onreceive()中起一个service来处理耗时的事件,所以我尝试启动了一个继承于service的服务。
由于是在framework下的powermangerservice中添加服务,首先我在base/core/res/androidmanifest.xml中添加了一个服务,在powermangerservice.java的同一个路径添加了一个服务.java文件用来启动服务使用(本来想在powermangerservice.java中直接使用内置类的方式解决的但是运行的时候总是提示找不到类)。
将耗时的事件处理放在了onstartcommand()函数里面。结果运行的时候可以处理事件,但是依然提示上面的错误LOG。
我想知道在系统启动的常驻服务里面启动一个继承于service的服务该怎么做?
添加广播的代码
在AndroidManifest.xml文件中添加一下代码位置在 application包含的范围里面
android下的broadcast机制,注册方式有动态和静态2种注册方式。
在应用中:
静态注册(通过androidmanifest中注册)的特点是可以由系统自动注销,而动态注册(在代码中注册)的则要调用注销函数来注销。
在framework中,添加一个广播我认为也是应该有这2种方式的。不过我不知道怎么使用静态方法注册(主要原因是不知道在哪里找那个XML文件,和怎么配XML文件)。在framework中动态添加一个广播(例如在powermangerservice.java 文件中添加了一个广播),在这个广播的onreceive函数中处理了一个较耗时间的事件(网友说onreceive的生存周期是10秒左右)。我通过一个应用发送了这个广播消息,广播收到消息执行了onreceive函数,运行的情况是:耗时的事件可以处理完成,但是会有错误LOG出现;但是按照网友的说法如果在onreceive里面处理了耗时的事件可能会导致ANR(可是这里没有出现ANR),我的广播在service里面,处理了耗时的事件,出现的仅仅是说我没有调用注销函数。
E/ActivityThread( 561): Activity com.android.launcher2.Launcher has leaked IntentReceiver com.android.launcher2.Launcher$1@213519a8 that was originally registered here. Are you missing a call to unregisterReceiver()?
没有调用unregisterReceiver()函数的原因是我希望这个广播可以重复的接收消息不希望注销掉,广播注册是在powermanagerservice初始化的时候做的。我试过在onreceive()函数中调用unregisterReceiver()函数注销掉广播,这样做了后,导致这个广播无法接受下一个广播消息了。
我想知道,我这想搞一个长期接收消息的广播该怎么做才可以,不注销广播是可以长期接收但是XT报错有是为什么,该怎么解决?关于广播的onreceive函数为什么不可以处理复杂的逻辑或者耗时的任务?在framework中注册广播(2个方法)怎么操作?
看网络资料说可以在onreceive()中起一个service来处理耗时的事件,所以我尝试启动了一个继承于service的服务。
由于是在framework下的powermangerservice中添加服务,首先我在base/core/res/androidmanifest.xml中添加了一个服务,在powermangerservice.java的同一个路径添加了一个服务.java文件用来启动服务使用(本来想在powermangerservice.java中直接使用内置类的方式解决的但是运行的时候总是提示找不到类)。
将耗时的事件处理放在了onstartcommand()函数里面。结果运行的时候可以处理事件,但是依然提示上面的错误LOG。
我想知道在系统启动的常驻服务里面启动一个继承于service的服务该怎么做?
添加广播的代码
void initInThread() {
.....
filter = new IntentFilter();
filter.addAction("fast");
mContext.registerReceiver(new FastPoweroffBroadcastReceiver(), filter);
....
}
private final class FastPoweroffBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.e(TAG,"you press no" + action);
Intent mIntent = new Intent(context, FastPoweroffService.class);
mIntent.putExtras(intent);
mIntent.putExtra("action", intent.getAction());
context.startService(mIntent);
//处理耗时的任务 (不开启服务的时候)
//开启服务就在服务里面处理
Log.e(TAG,"onReceive is over");
}
}
在AndroidManifest.xml文件中添加一下代码位置在 application包含的范围里面
<service android:name="com.android.server.FastPoweroffService"