是否有可能来自两个应用程序的两个 BroadcastReceiver 基于相同的广播意图操作,以某种方式"collide"?



我在服务中有一个BroadcastReceiver

public class NotificationClickService extends Service {
    private static final String DEBUG_TAG = "NotificationClickService";
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate() {
        registerReceiver(NotificationClickReceiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
    }
    @Override
      public void onDestroy() {
        unregisterReceiver(NotificationClickReceiver);
    }
    BroadcastReceiver NotificationClickReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(DEBUG_TAG, "NotificationClickReceiver: onReceive CALLED");
                Intent i = new Intent(android.app.DownloadManager.ACTION_VIEW_DOWNLOADS);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                        Intent.FLAG_ACTIVITY_SINGLE_TOP | 
                        Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                        Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                context.startActivity(i);
        }
    };
}

这使系统下载管理器处于领先地位。

在我的手机上,我正在运行基于JellyBean的CyanogenMod 10.1。

但是。。。

一旦系统应用程序CMupdater启动:

  • 如果CMupdater当前正在运行,它将从我的服务的BroadcastReceiver而不是DownloadManager调用
  • 如果CMupdater没有运行,但至少运行了一次,则根本不会调用我的接收器

如果我重新启动并且不运行更新程序,它会再次工作。所有测试也在我的平板电脑上与相应的CyanogenMod 10.1版本。

这是来自CM的接收器:

package com.cyanogenmod.updater.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.cyanogenmod.updater.UpdatesSettings;
public class NotificationClickReceiver extends BroadcastReceiver{
     private static String TAG = "NotificationClickReceiver";
     @Override
     public void onReceive(Context context, Intent intent) {
         // Bring the main app to the foreground
         Intent i = new Intent(context, UpdatesSettings.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
                 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         context.startActivity(i);
     }
 }

从清单上看:

    <receiver android:name="com.cyanogenmod.updater.receiver.NotificationClickReceiver">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            <category android:name="android.intent.category.HOME"/>
        </intent-filter>
    </receiver>

android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED是我使用的DownloadManager.ACTION_NOTIFICATION_CLICKED意图的常数值。

虽然我仍然很难破译你的问题,但我不知道你的接收器是如何被调用的。您的意向过滤器中缺少类别注册。

尝试:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED); 
filter.addCategory(Intent.CATEGORY_HOME);
registerReceiver(NotificationClickReceiver, filter);

这应该确保您始终接收到与清单注册接收器相同的广播。

将通知所有匹配的BroadcastRecievers及其相应的Context。请注意,这可能通过两种方式发生:

  1. 如果Receiver是在代码中本地创建并在某个对象内部注册的,则只有当该对象在附近时才会调用它。

  2. 如果在清单中声明了Reciever,则将创建该对象并调用onReceive()方法。

因此,您可以让Service类实现BroadCastReciever,在Manifest文件中声明它,并从它的onRecieve()开始您的服务;

相关内容

  • 没有找到相关文章

最新更新