リスト(文字列)の内容をNotificationを使って通知しようとしています
最初に通知した際は想定通りに動くのですがリストを削除、追加して通知しようとすると更新前のの前回の内容で通知されてしまいます
更新されたリストの内容で通知したいです。
リスト自体は中身を取得して確認していますが問題無いようです
何が原因なのでしょうか?
以下が簡略化したソースになります
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<String> listName=new ArrayList<>();
private int count=3;
private String s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i=0;i<3;i++){
listName.add(String.valueOf(i));
}
s="list1="+listName.get(0)+" list2="+listName.get(1)+" list3="+listName.get(2);
TextView textView=findViewById(R.id.textView);
textView.setText(s);
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listName.remove(0);
listName.add(2,String.valueOf(count));
count++;
s="list1="+listName.get(0)+" list2="+listName.get(1)+" list3="+listName.get(2);
TextView textView=findViewById(R.id.textView);
textView.setText(s);
}
});
Button button1=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setAlarm();
}
});
}
private void setAlarm(){
for(int i=0;i<listName.size();i++){
Intent intent = new Intent(getApplicationContext(),
AlarmBroadcastReceiver.class);
intent.putExtra("intent",listName.get(i));
intent.putExtra("req",i);
PendingIntent pending = PendingIntent.getBroadcast(
getApplicationContext(), i, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
if(am != null) {
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(i+1)*10000, pending);
}
}
Toast.makeText(getApplicationContext(),
"set Alarm", Toast.LENGTH_SHORT).show();
}
}
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.widget.Toast;
public class AlarmBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String s=intent.getStringExtra("intent");
int req=intent.getIntExtra("req",0);
String title = context.getString(R.string.app_name);
String message ="『" +s+"』からの通知";
Intent ni = new Intent(context,MainActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, req, ni,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
NotificationManager notificationManager =
(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel;
channel = new NotificationChannel(
"def", title , NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(message);
channel.enableVibration(true);
channel.canShowBadge();
channel.enableLights(true);
channel.setLightColor(Color.BLUE);
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
channel.setSound(defaultSoundUri, null);
channel.setShowBadge(true);
if(notificationManager != null){
notificationManager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(context, "def")
.setContentTitle(title)
.setSmallIcon(android.R.drawable.ic_lock_idle_alarm)
.setContentText(message)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setTicker(message)
.setWhen(System.currentTimeMillis())
.build();
notificationManager.notify(R.string.app_name, notification);
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}else {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(android.R.drawable.ic_lock_idle_alarm);
builder.setContentIntent(pendingIntent);
builder.setContentTitle(title);
builder.setContentText(message);
builder.setTicker(message);
builder.setAutoCancel(true);
long[] vibrate_ptn = {0, 150, 300, 150};
builder.setVibrate(vibrate_ptn);
NotificationManagerCompat manager = NotificationManagerCompat.from(context);
manager.notify(req, builder.build());
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
恐らくですが、PendingIntent.getBroadcast()の第4引数に適切なフラグをセットしなければ、同一内容のIntentが送られてしまうことになるのではないかと思います。PendingIntent.FLAG_CANCEL_CURRENT
かPendingIntent.FLAG_UPDATE_CURRENT
のいずれかをセットすればいいのではないかと思います。
(参考)公式の資料
PendingIntent.FLAG_CANCEL_CURRENTは「既存のPendingIntentが存在すれば、現在のものを取り消して新しいPendingIntentを生成する」
PendingIntent.FLAG_UPDATE_CURRENTは「既存のPendingIntentが存在してもそれを保持するが、Intentのextraデータを更新する」
という感じなのかな?(ほぼ直訳)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/05/05 00:06
無事に解決する事が出来ました。