【问题标题】:android-avoiding activity recreation when clicking notification not working单击通知不起作用时,android-避免活动娱乐
【发布时间】:2021-09-27 18:56:31
【问题描述】:

我的应用程序中有一个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)。有什么问题?

【问题讨论】:

  • 能否请您发布您的new Intent 实施sn-p ?你在哪里定义PendingIntent?
  • 您的代码按预期运行,如果您仍然遇到问题,请分享更多详细信息以进行调试并帮助您解决问题:)
  • @RaguSwaminathan 我只是重写 OnNewIntent 以查看它是否被调用:protected void onNewIntent(Intent intent) {super.onNewIntent(intent); setIntent(intent); Log.i(TAG, "hello!");
  • 正如我在问题中提到的,我是从 MainActivity 本身运行这段代码,所以 PendingIntent 也在那里创建。
  • 我可以按预期工作。如果需要,我可以发布我的答案以供您理解。

标签: android android-intent android-activity android-notifications


【解决方案1】:

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

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

以下是我的 sn-p 供参考。我是在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 内部生成通知。

【讨论】:

  • 我昨天测试了我的代码很多次,但没有成功!但现在我再次测试,它成功了!!!它还与getApplicationContext() 和setIntent 一起工作。无论如何感谢您的代码。
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多