相关疑难解决方法(0)

何时注册/取消注册活动中创建的广播接收器?

我需要在活动的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)

android broadcastreceiver

75
推荐指数
4
解决办法
5万
查看次数

错误:YouTubeService已泄露IntentReceiver ...您是否错过了对unregisterReceiver()的调用?

我使用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)

android youtube-api android-youtube-api

9
推荐指数
1
解决办法
4237
查看次数

服务泄露了最初在这里注册的 IntentReceiver。您是否错过了对 unregisterReceiver() 的调用?

我正在使用前台 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)

java android android-service android-broadcastreceiver

5
推荐指数
1
解决办法
3229
查看次数