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); –