ユーザーが押すと Send "Button 1"(アプリの構成を確認するには下にスクロールしてください)Notification
から新しい RefreshService
が作成されます。ユーザーがこの通知を押すと、MainActivity
インスタンスが開始され、- String
に値_Button 1
_が Intent
。
この値が表示されます。
ユーザーが今押すと Send "Button 2" 新しい Notification
がRefreshService
から作成されます。ユーザーがこの通知を押すと、MainActivity
インスタンスが開始され、 String
[〜#〜]も受け取ります[〜# 〜]Intent
よりも値_Button 1
_を使用します。
したがって、ご想像のとおり、通常は_Button 2
_という値が存在するはずです。
ユーザーが最初に押したボタンが Send "Button 2" その後、常に_Button 2
_が送信されます。
2番目のボタンの値を取得する唯一の解決策は、電話を再起動して2番目のボタンを最初に押すことです。強制クローズでも機能しません。
UIを別の方法で変更することもできます。しかし、「MainActivity」を別の Intent
で再起動する必要があるアプリでは、このアプローチが必要なので、アプローチは同じでなければなりません。
A Activity
と呼ばれ、MainActivity
A IntentService
と呼ばれ、RefreshService
MainActivity
_public class MainActivity extends Activity implements View.OnClickListener {
public static final String RECEIVED = "received";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView)findViewById(R.id.textView_received)).setText(getIntent().getStringExtra(RECEIVED));
findViewById(R.id.button_1).setOnClickListener(this);
findViewById(R.id.button_2).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this, RefreshService.class);
if(v.getId() == R.id.button_1){
intent.putExtra(RECEIVED, "Button 1");
Toast.makeText(this,"Sent \"Button 1\"",Toast.LENGTH_LONG).show();
}
else if(v.getId() == R.id.button_2){
intent.putExtra(RECEIVED, "Button 2");
Toast.makeText(this,"Sent \"Button 2\"",Toast.LENGTH_LONG).show();
}
startService(intent);
}
}
_
RefreshService
_public class RefreshService extends IntentService {
public RefreshService() {
super("RefreshService");
}
@Override
protected void onHandleIntent(Intent intent) {
String received = intent.getStringExtra(MainActivity.RECEIVED);
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.putExtra(MainActivity.RECEIVED, received);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle("IntentServiceRefresh").setContentText(received).setSmallIcon(R.drawable.ic_notification_small).setContentIntent(pendingIntent);
Notification notification = builder.build();
// Hide the notification after it's selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
}
}
_
アプリのレイアウト
私の疑いは、インテントで変更されるのはエクストラだけなので、PendingIntent.getActivity(...)
ファクトリーメソッドは古いインテントを最適化として再利用しているだけだということです。
RefreshServiceで、次のことを試してください。
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
見る:
http://developer.Android.com/reference/Android/app/PendingIntent.html#FLAG_CANCEL_CURRENT