我需要在活动的onCreate事件中创建自定义广播接收器,显然我需要在活动的onDestroy事件中取消注册广播接收器
为清楚起见,这是我使用的代码片段
public class AnActivity extends Activity {
private ResponseReceiver receiver;
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP =
"mypackagename.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() …Run Code Online (Sandbox Code Playgroud) 我使用YoutubeServie API在我的Android应用程序中播放youtube视频.然而,当我退出我的活动时,我发现下面的崩溃日志显示,甚至我的应用程序仍然有效.
02-28 15:54:02.081 20374-20374/? E/ActivityThread: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver com.google.android.libraries.youtube.player.audiofocus.HeadsetPlugReceiver@a843e7c that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver com.google.android.libraries.youtube.player.audiofocus.HeadsetPlugReceiver@a843e7c that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:898)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:699)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1637)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1617)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1611)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:488)
at com.google.android.libraries.youtube.player.service.PlaybackService.<init>(PlaybackService.java:5034)
at com.google.android.libraries.youtube.player.PlayerInjector$12.create(PlayerInjector.java:1602)
at com.google.android.libraries.youtube.common.util.Lazy.get(Lazy.java:136)
at com.google.android.libraries.youtube.player.PlayerInjector.getPlaybackService(PlayerInjector.java:575)
at com.google.android.apps.youtube.api.ApiPlayer.moveToForeground(ApiPlayer.java:493)
at com.google.android.apps.youtube.api.ApiPlayer.<init>(ApiPlayer.java:150)
at com.google.android.apps.youtube.api.service.jar.ApiPlayerService.<init>(ApiPlayerService.java:131)
at com.google.android.apps.youtube.api.service.jar.ApiPlayerFactoryService$1.run(ApiPlayerFactoryService.java:86)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用前台 AndroidService通过 REST API 请求一个带有 Retrofit 的资源,作为每 60 秒的计时器。此类服务也在与应用程序不同的进程中运行,这是必要的,以便 Android 在进入 Doze 模式时不会杀死它。
public class ResourceService extends Service {
...
private BroadcastReceiver mReceiver;
@Override
public void onCreate() {
super.onCreate();
// create mReceiver (BroadcastReceiver)
// create intentFilter (IntentFilter)
registerReceiver(mReceiver, intentFilter);
}
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// main logic
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
}
Run Code Online (Sandbox Code Playgroud)
当我注销应用程序时,onDestroy()方法被调用,因此unregisterReceiver()也被调用。应用程序按预期进入登录活动,服务成功停止。但是,logcat 出现以下异常:
09-18 09:30:06.627 849-849/foo.mycompany.es.myapp:externalProcess E/ActivityThread: Service foo.mycompany.es.myapp.resources.ResourcesService has leaked …Run Code Online (Sandbox Code Playgroud)