繁体   English   中英

单击通知不起作用时避免 android 活动娱乐

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM