[英]android-avoiding activity recreation when clicking notification not working
我的应用程序中有一个Activity
(称为 MainActivity),当我向用户发送通知时,如果单击通知,我希望它被打开。 重要的一点是避免活动重新创建,如果已经有一个活动实例,请将其放在前面并将数据传递给它。 为了获得这种行为,我尝试过:
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
并重新创建活动。 请注意,因为我正在测试,所以我从 MainActivity 本身发送通知,当它打开时,我拖动状态栏并单击我的通知(然后重新创建 MainActivity)。 问题是什么?
您共享的代码似乎很好,我看到的唯一问题是setIntent()
内的onNewIntent()
。
也许您可以尝试删除它们并检查。 接下来是您在PendingIntent
中传递的getApplicationContext()
。 尝试将其作为MainActivity.this
传递。
下面是我的片段供参考。 我是用Kotlin
而不是Java
。 不过逻辑是一样的。
清单文件
<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
内部生成通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.