所以这个应用程序包含一个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);
}
}
单击通知时,将启动一个新的活动,并在意图中传递一些数据,包括通知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;
}
}
当我运行应用程序时,它的工作原理很奇怪。当我创建通知然后单击它时,它会启动第二个活动并显示正确的数据,完成按钮会从状态栏中取消通知。但是当我创建第二个通知并单击它时,它会启动第二个活动,但会显示第一个应用程序包含的旧数据。我需要防止这种情况发生。
到目前为止,我认为问题在于我的活动正在恢复savedInstanceState,但我在第二个活动中将其设置为'null'。究竟是什么问题?
关于活动恢复savedInstanceState甚至是一个问题还是我的逻辑?
感谢您的帮助。
答案 0 :(得分:3)
您必须在FLAG_ACTIVITY_NEW_TASK
创建中添加PendingIntent
标记,因为从Activity
启动的Notification
来自应用程序上下文之外。所以修改你的代码如下:
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
此外,我注意到您已经在使用支持库,我强烈建议您转到使用Notification.Builder
而不是使用setLatestEventInfo()
,这是不推荐的实践。以下代码使用支持库中的构建器API创建相同的Notification
。
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
实例将简单地替换第一个和不创造第二个。解决此问题的一种方法是使用您传递给NotificationManager
的相同唯一ID,并将其用作PendingIntent
的请求代码,即:
PendingIntent pendingIntent =
PendingIntent.getActivity(this, i, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
这将使您创建的每个PendingIntent
足够独特,以传输正确的数据。
答案 1 :(得分:0)
您可以尝试在第一个活动中处理简历
OnResume()
{
super.onresume();
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(id);
}
在完成第二个活动后,必须在第一个活动中输入on resume方法。