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
.
内部生成了通知
我的应用程序(称为 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
.