单击通知后阻止新活动实例

时间:2010-06-24 15:22:04

标签: android android-activity instance notifications

应用程序(非通缉)行为 -

  1. 应用程序启动,一些文本放入文本框,通过按钮操作创建通知。
  2. 用户“点击”主页按钮,应用程序“最小化”,通知在栏中
  3. 用户选择通知,应用程序“最大化”
  4. 但是 - 不是原始实例,而是启动新实例(例如,在最新的实例中缺少原始文本;当最新实例关闭时,仍然存在具有原始文本的原始实例。)

    通知方法的代码

    Context context = getApplicationContext();
        CharSequence contentTitle = "someText1";
        CharSequence contentText = "someText2";
        Intent notifyIntent = new Intent(Intent.ACTION_MAIN);
        notifyIntent.setClass(getApplicationContext(), RadioStream.class);
        PendingIntent intent = 
           PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);
    
        notifyDetails.setLatestEventInfo(context, contentTitle, contentText, intent);
        mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
    

    我也在标签

    之后的清单xml文件中
    android:launchMode="singleTask"
    

    但它仍然是一样的...... 主要问题是应用程序的双/三初始化,我知道还有其他方法可以保留恢复的应用程序中的值。 此外,还需要应用程序保持在后台运行,因为主要功能是互联网广播流。

    代码中缺少什么? 我方缺少哪些信息来解决问题?

    谢谢!

    DAV

9 个答案:

答案 0 :(得分:20)

您所称的“应用程序”很可能是一项活动。为了避免在提到前面时重新设置,请使用

android:launchMode="singleTop"

要让某些代码运行后台,您需要将其视为Service

答案 1 :(得分:13)

另一种选择是在setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)上使用Intent

答案 2 :(得分:3)

将此标记添加到您的活动属性中。

  

android:launchMode =“singleInstance”

答案 3 :(得分:2)

您可以在PendingIntent上设置PendingIntent.FLAG_CANCEL_CURRENT:

PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
            PendingIntent.FLAG_CANCEL_CURRENT);

如果活动已经存在,新活动将取消而不更新旧活动! 这对我有用!

答案 4 :(得分:1)

作为服务重新实现 - 一切都按预期工作

答案 5 :(得分:0)

我使用GCM示例作为个人项目的基本代码,我遇到了相同的问题。 GCM示例:https://github.com/googlesamples/google-services/tree/master/android/gcm/app/src/main/java/gcm/play

我通过结合答案找到了解决方案:

1)从@ognian回答,通过在应用程序部分添加App Manifest:

<强>机器人:launchMode =&#34; singleTop&#34;

<application
    android:allowBackup="true"
    android:icon="@mipmap/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    **android:launchMode="singleInstance">**

2)来自@CommonsWare,设置 setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)

private void sendNotification(String message) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

答案 6 :(得分:0)

使用以下组合对我有用。

1)在Manifest文件中添加启动模式 的机器人:launchMode = “singleInstance”

2)在创建意图时设置setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)。

intent = new Intent(this,StartUpActivity.class);      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

答案 7 :(得分:0)

这会将应用程序恢复到 MainActivity ,即使它已打开子活动。儿童活动也被清除。

AndroidManifest:

android:launchMode="singleTop"

代码:

val intent = Intent(context, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)

答案 8 :(得分:-2)

而不是:

notifyIntent.setClass(getApplicationContext(), RadioStream.class);
PendingIntent intent =   PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);

只需使用这些行,它就会有所帮助,

notifyIntent = new Intent();
PendingIntent intent= PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);