我有一个面向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操作进入,这正常吗?
1条答案
按热度按时间bqf10yzr1#
是的,这很正常。你把两件事搞混了。
清单中的
<intent-filter>
声明控制使用哪些Intent
操作来启动Activity
。这与广播
Intent
无关。广播Intent
用于触发BroadcastReceiver
,它们与活动无关。