【发布时间】:2018-10-08 07:38:01
【问题描述】:
注意:带有android:excludeFromRecents="true"的活动标志
@Override
protected void onDestroy() {
sendBroadcast(new Intent("com.android.servicerestart"));
if(broadcastReceiver != null) {
try {
unregisterReceiver(broadcastReceiver);
}
catch (IllegalArgumentException E)
{
}
}
super.onDestroy();
Log.e("Activity","In OnDestroy");
}
@Override
protected void onPause() {
if(broadcastReceiver != null) {
try {
unregisterReceiver(broadcastReceiver);
}
catch (IllegalArgumentException E)
{
E.printStackTrace();
}
}
super.onPause();
Log.e("Activity","In OnPause");
}
@Override
protected void onResume() {
registerReceiver();
super.onResume();
Log.e("Activity","In onResume");
}
@Override
protected void onStart() {
super.onStart();
try {
registerReceiver();
}
catch (Exception E)
{
}
}
registerReceiver();
private void registerReceiver() {
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
try {
registerReceiver(broadcastReceiver, new IntentFilter("*******.receive.service.download"));
}
catch (Exception E)
{
}
}
日志
E/ActivityThread: Activity **********.activity.MainActivity has leaked IntentReceiver **********.activity.MainActivity$3@3318724 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity **********.activity.MainActivity has leaked IntentReceiver **********.activity.MainActivity$3@3318724 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1164)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:951)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1308)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1288)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1282)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:586)
at **********.activity.MainActivity.registerReceiver(MainActivity.java:203)
at **********.activity.MainActivity.onStart(MainActivity.java:156)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1255)
at android.app.Activity.performStart(Activity.java:6853)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2712)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2810)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6256)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)
【问题讨论】:
-
为什么你注册和注销接收器两次?只需在 onResume() 和 onPause() 中注册和注销即可
-
注册和注销接收器两次?为什么为什么?
onPause() -> onStop(),这是生命周期。现在,onPause()已经注销了您的接收器,并出现了后者的onStop()调用,它试图注销以前未注册的接收器,这就是您收到此异常的原因。我建议您在 resume-pause 或 start-stop lifecylce 方法对中注册-取消注册——不要同时使用。 -
发生这种情况是因为我注册了接收者和未注册的接收者两次?
-
我清楚地看到的一件事是,您应该在每次调用
unregisterReceiver(broadcastReceiver);后设置broadcastReceiver = null -
@ZeekHuge 好的,我会试试的
标签: java android broadcastreceiver intentfilter