android-避免 activity 单击通知不起作用时重新创建

android-avoiding activity recreation when clicking notification not working

我的应用程序(称为 MainActivity)中有一个 Activity,当我向用户发送通知时,我希望它在单击通知时打开。 重要的一点是避免 activity 重新创建,如果已经有它的实例存在,请将它放在前面并将数据传递给它。为了获得这种行为,我尝试过:

Intent intent = new Intent(getApplicationContext(), MainActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
.putExtra("data", ...);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

并在清单中:

<activity
 android:name="...activities.MainActivity"
 android:launchMode="singleTop"
 android:screenOrientation="portrait"
 android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen.Light">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 activity>

但是当我触摸通知时,onNewIntent(Intent intent) 方法永远不会被调用,而是调用 onCreate 并重新创建 activity。请注意,因为我正在测试,所以我从 MainActivity 本身发送通知,当它打开时,我拖动状态栏并单击我的通知(然后重新创建 MainActivity)。有什么问题?

您共享的代码似乎没问题,我看到的唯一问题是 onNewIntent() 中的 setIntent()

也许你可以尝试删除它们并检查。接下来是 getApplicationContext(),您要传入 PendingIntent。尝试将其作为 MainActivity.this.

传递

以下是我的参考片段。我是在 Kotlin 而不是 Java 中完成的。但是逻辑是一样的。

Manifest.xml

<activity
   android:name = ".MainActivity"
   android:launchMode = "singleTop">
  <intent-filter>
    <action android:name = "android.intent.action.MAIN" />

    <category android:name = "android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

生成通知的逻辑驻留在MainActivity

    val intent = Intent(this, MainActivity::class.java)
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
    intent.putExtra("DATA", "SENT FROM PENDING INTENT")
    val contentIntent = PendingIntent.getActivity(
        applicationContext,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )

    val b = NotificationCompat.Builder(this, getString(R.string.app_name))

    b.setAutoCancel(true)
        .setDefaults(Notification.DEFAULT_ALL)
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle("Default notification")
        .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
        .setContentIntent(contentIntent)
        .setContentInfo("Info")

    val nmanager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    nmanager.notify(1, b.build())

这是我的onNewIntent()部分

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    Log.i("onNewIntent", "Called")
    intent?.let {
        binder.msgView.text = it.getStringExtra("DATA")
        Log.i("onNewIntent:", "Received new intent data")
    }
}

注意:在按钮操作的帮助下,我从 MainActivity.

内部生成了通知