1

在我的应用程序中,我使用 GCM 和推送通知。但是,我有点担心广播接收器。在应用程序中,我看到广播接收器被声明为 2 种类型。

  1. 通过清单静态

       <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.myapp" />
        </intent-filter>
    </receiver>
    
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
  2. 程序化内部活动

       private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    
        String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
    
        WakeLocker.acquire(getApplicationContext());
    
        Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();
    
        WakeLocker.release();
    }  };
    

我的问题如下:

问题1:我们可以删除广播接收器的程序声明并仍然获得完全有效的通知吗?如果是,是因为我们已经在清单中有它的原因吗?

问题 2:如果接收器被声明为静态和程序化的,那么在什么时候调用哪一个?哪个优先?如果应用程序已打开并运行程序化应用程序被调用?如果应用程序没有运行,静态的?

4

1 回答 1

2

问题 #1 对我来说毫无意义,抱歉。

如果接收器被声明为静态和编程的,那么在什么时候调用哪一个?

如果他们都有IntentFilter匹配同一个广播的 s,他们都会收到广播。对于常规广播,他们接收广播的顺序是不确定的。

哪个优先?

对于常规广播,两者都没有“优先级”——两者都获得广播,而您无法知道谁先获得广播(理论上,在多核设备上,他们可以同时获得广播)。有序广播允许您控制传递的优先级,并且一次只有一个接收者会收到有序广播。

如果应用程序已打开并运行程序化应用程序被调用?

如果“应用程序已打开并正在运行”意味着您已通过清单registerReceiver() 清单注册了您的接收器,那么它们都会收到广播。

如果应用程序没有运行,静态的?

如果“未运行”表示您已取消注册您通过 注册的接收器registerReceiver(),则只有在清单中注册的接收器将接收广播。

于 2013-05-20T08:56:08.737 回答