android中的编程与静态广播接收器

时间:2013-05-20 08:41:16

标签: android broadcastreceiver manifest google-cloud-messaging

在我的应用中,我正在使用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();
    }  };
    
  3. 我的问题如下:

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

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

1 个答案:

答案 0 :(得分:2)

问题#1对我没有意义,抱歉。

  

如果接收器被声明为静态和编程,哪一个被调用?

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

  

哪一个优先?

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

  

如果应用程序已打开并且正在运行程序化的应用程序?

如果“该应用程序已打开并正在运行”表示您已通过registerReceiver() 清单注册了您的收件人,则他们都会收到广播。

  

如果应用程序未运行,则为静态应用程序?

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