android 清单中的Activity Intent筛选器标记未按预期工作

6rqinv9w  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(138)

我有一个面向API〉= 22的应用程序,它有一个独特的单top Activity,在清单中配置为:

<activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@style/Theme.MyApplication.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

注意上面的android.intent.action.MAIN字符串。我有一个云(Firebase)消息传递服务是这样配置的:

<service
        android:name=".MyService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

我的典型使用场景是当我的应用程序已经在前台运行时接收消息。当接收到传入消息时,我的服务的onMessageReceived方法运行,并执行以下操作:

@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    [...]
    Intent intent = new Intent("com.example.myapplication.myservice");
    intent.putExtra("foo", "bar");

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode++, intent, PendingIntent.FLAG_ONE_SHOT);
    showNotification(
              getTitle(),
              getBody(),
              pendingIntent);
}

注意上面的"com.example.myapplication.myservice"操作字符串。我有一个片段监视广播消息,如下所示:

IntentFilter filter = new IntentFilter("com.example.myapplication.myservice");
    requireActivity().registerReceiver(new MyBroadcastReceiver(), filter);

接收方确实被成功调用,接收到调用onMessageReceived时创建的消息。
知道清单中Activity的<intent-filter>标记应该只允许android.intent.action.MAIN Intent操作进入,这正常吗?

bqf10yzr

bqf10yzr1#

是的,这很正常。你把两件事搞混了。
清单中的<intent-filter>声明控制使用哪些Intent操作来启动Activity
这与广播Intent无关。广播Intent用于触发BroadcastReceiver,它们与活动无关。

相关问题