1

所以这个应用程序包含一个 2 活动。第一个要求用户提供有关发出通知的规范。在按钮上单击活动会创建通知。此活动的代码如下:

package com.dewey.notifymanager;

import java.util.Random;


import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button button = (Button) findViewById(R.id.button1);
        final TextView texty = (TextView) findViewById(R.id.textView2);
        final EditText input = (EditText) findViewById(R.id.editText1);
        final EditText input2 = (EditText) findViewById(R.id.editText2);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                String notificationmessage = input.getText().toString();
                String notificationdetails = input2.getText().toString();
                texty.setText("Notification Created");
                displayNotification(notificationmessage, notificationdetails);
            }
        });
    }
    @Override
    protected void onStart() {

    super.onStart();


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }



    public void displayNotification(String msg,String details)
    {

         NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         Notification notification = new Notification(R.drawable.ic_launcher, msg, System.currentTimeMillis());

        Random generator = new Random();
        int i = 90686958 - generator.nextInt(92938);


        Intent intent = new Intent(this, ResultActivity.class);
        intent.putExtra("details", details);
        intent.putExtra("msg", msg);
        intent.putExtra("id", i);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        notification.setLatestEventInfo(this, msg, details, pendingIntent);
        notification.flags = notification.FLAG_ONGOING_EVENT;
        manager.notify(i, notification);








    }

}

单击通知时,将启动一个新的 Activity,并在 Intent 中传递一些数据,包括通知 ID。然后第二个活动显示通知包含的数据,它还有一个按钮。当用户单击此按钮时,通知将被删除。第二个活动的代码如下:

package com.dewey.notifymanager;

import android.os.Bundle;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(null);
        setContentView(R.layout.activity_result);

        String details = getIntent().getExtras().getString("details");
        String msg = getIntent().getExtras().getString("msg");
        final int id = getIntent().getExtras().getInt("id");
        TextView title = (TextView)findViewById(R.id.title);
        TextView descrip = (TextView)findViewById(R.id.details);
        title.setText(msg);
        descrip.setText(details);

        Button exitButton = (Button)findViewById(R.id.exitButton);
        exitButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                NotificationManager notificationManager = (NotificationManager) 

              getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.cancel(id);
            finish();

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_result, menu);
        return true;
    }
}

当我运行该应用程序时,它的工作方式很奇怪。当我创建一个通知然后单击它时,它会启动第二个活动并显示正确的数据,并且完成按钮会将通知从状态栏上删除。但是当我创建第二个通知并单击它时,它会启动第二个活动,但会显示第一个应用程序包含的旧数据。我需要防止这种情况发生。

到目前为止,我认为问题在于我的活动正在恢复已保存实例状态,但我在第二个活动中将其设置为“null”。我的问题到底是什么?

关于恢复 saveInstanceState 的活动甚至是一个问题,还是我的逻辑?

谢谢您的帮助。

4

2 回答 2

3

您必须将FLAG_ACTIVITY_NEW_TASK标志添加到您的PendingIntent创建中,因为从应用程序上下文Activity启动的Notification来自外部。所以修改你的代码如下:

PendingIntent pendingIntent =
    PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

此外,我注意到您已经在使用支持库,我强烈建议您改用 usingNotification.Builder而不是 using setLatestEventInfo(),这是一种已弃用的做法。以下代码Notification使用支持库中的构建器 API 创建相同的 .

NotificationManager manager =
    (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

Random generator = new Random();
int i = 90686958 - generator.nextInt(92938);

Intent intent = new Intent(this, ResultActivity.class);
intent.putExtra("details", details);
intent.putExtra("msg", msg);
intent.putExtra("id", i);
PendingIntent pendingIntent =
    PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setTicker(msg);
builder.setSmallIcon(R.drawable.ic_launcher);

builder.setContentTitle(msg);
builder.setContentText(details);
builder.setContentIntent(pendingIntent);

Notification notification = builder.build();
manager.notify(i, notification);

作为旁注,如果您计划实现任何分层导航,您也可以考虑使用TaskStackBuilder支持库中的 来为您构建。PendingIntent

编辑

根据您关于一次创建多个的第二个问题Notification。首先,我不得不说这不一定是一个好的模式;您的应用程序不应该养成使用多个行项污染设备的窗帘的习惯,将它们压缩,您的用户会感谢您。

但是,更重要的是,您无法使其工作的原因是因为使用PendingIntent与前一个实例相同的操作、数据、目标等创建的实例将简单地替换第一个而不创建第二个。您可以解决此问题的一种方法是使用您传递给的相同唯一 ID,NotificationManager并将其用作请求代码PendingIntent,即:

PendingIntent pendingIntent =
    PendingIntent.getActivity(this, i, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

这将使PendingIntent您创建的每一个都足够独特以传输正确的数据。

于 2013-01-12T05:23:21.443 回答
0

您可以尝试在您的第一个活动中处理简历

OnResume()
{
super.onresume();
 NotificationManager notificationManager = (NotificationManager) 

              getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.cancel(id);
}  

并且在完成第二个活动后,必须在第一个活动中输入 on resume 方法。

于 2013-01-11T22:36:47.833 回答