1

因此,此应用程序包含一个2个活动。第一个要求用户提供通知的规格。在按钮上点击该活动创建通知。这项活动的代码如下:Android活动保持恢复保存的实例状态

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,但我把它的第二个活动设置为“零”。我的问题究竟是什么?

它甚至关于活动恢复savedInstanceState或者是我的逻辑有问题?

感谢您的帮助。

+0

这似乎是第二个意图有陈旧的数据。 – dmon

回答

3

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

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你创造足够的唯一传输正确的数据。

+0

谢谢@Dewinwired!当谈到Android Java时,我是一个noob。这些解决方案是有效的,但它只适用于我一次创建一个通知并取消它。如果我创建了2个通知,然后点击其中一个,则更新不会更新,并且无法正常运行。 – turnt

+0

我已经编辑了一些关于此的注释。 – Devunwired

0

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

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

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

,你在完成第二次活动后,必须在第一个活动进入上恢复方法。

+0

是的,但如果用户通过重新打开或按下后退按钮恢复第一次活动,该怎么办? – turnt

+0

编译器在用户按下超级用户时输入onresume(),或者如果有意图再次打开第一个活动,请将该标志添加到您的活动中 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); –