bugfix> android > 投稿

プッシュ通知を使用して定期的なタスクを作成するためのアプリケーションがあります。複数のタスクを追加すると(それぞれに一意のIDがあります)、プッシュ通知に最後のタスクのデータが含まれているように見えます。 LogCatで確認し、TaskActivity 各タスクには一意のIDがありますが、AlarmService 最後に入力されたタスクのみが表示されます。

よく検索しますが、何が間違っているのかについての手がかりを見つけることができませんでした。

PendingIntent.FLAG_UPDATE_CURRENT も変更しました FLAG_CANCEL_CURRENT へおよび FLAG_ONE_SHOT しかし、うまくいきませんでした。

intent を追加することを考えましたタスクごとに、しかし、私はそれを行う方法を見つけることができませんでした。

TaskActivity

  .
   .
   .
    public void setNotificationForNewTaskInside() {
    alarmManager = (AlarmManager) getApplicationContext().getSystemService(
            ALARM_SERVICE);
    Intent alarmIntent = new Intent(this,AlarmReceiver.class);
    Random random = new Random();
    randomNum= random.nextInt(9999 - 1000) + 1000;
     pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
             randomNum, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (DeviceTimeAndDate.devicetaskTimeDate.equals(newtaskTimeDate)) {
       finalLong=System.currentTimeMillis();
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, finalLong, pendingIntent);
    }
   else   if (DeviceTimeAndDate.devicetaskTimeDate.before(newtaskTimeDate)) {
       finalLong=new_task_timeInMilliseconds;
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, finalLong, pendingIntent);
    } else if (DeviceTimeAndDate.devicetaskTimeDate.after(newtaskTimeDate)) {
        Toast.makeText(context, "زمان یا تاریخ مورد گذشنه است، لطفا زمان دیگری را انتخاب کنید", Toast.LENGTH_SHORT).show();
        startDate.setText(DeviceTimeAndDate.deviceTime);
        taskTime.setText(EditTaskActivity.secondMiConver);
    }

AlarmReciver

public class AlarmReceiver  extends BroadcastReceiver {
 String TAG = "AlarmReceiver";
  public RemoteViews remoteViews;
public  Uri sound;
public Context context;
public Notification notification;
int finalRandumNum;
 public  static String getTitle,getTime;
public AlarmReceiver (){
}
@Override
    public void onReceive(Context context, Intent intent) {
    sound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/plucky");
      remoteViews= new RemoteViews(context.getPackageName(), R.layout.notification);
        remoteViews.setImageViewResource(R.id.notif_image, R.mipmap.ic_launcher);
      remoteViews.setTextViewText(R.id.title,getTitle);
     remoteViews.setTextViewText(R.id.text,getTime);
    NotificationManager notif=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    android.app.Notification notify=new NotificationCompat.Builder(context, "CHANNEL_ID")
            .setContentTitle(TaskActivity.subjEntry)
            .setWhen(finalLong)
            .setSound(sound)
            .setContentText(TaskActivity.timeEntryy)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(TaskActivity.pendingIntent)
            .build();
    notif.notify(TaskActivity.randomNum, notify);

回答 1 件
  • あなたは変数にタスクの詳細を保存することで間違いを犯していると思います(TaskActivity.subjEntryおよびTaskActivity.timeEntryy )つまり、新しいタスクを追加しようとするたびにデータが置き換えられます。

    そのため、データベース、配列、またはその他のデータ構造にデータを保存し、通知を作成するときにデータを取得する必要があります。

    データをSQlite DBに保存する
    public void addData(Data data){
        SQLiteDatabase database = getWritableDatabase();
        ContentValues cv_data = new ContentValues();
        cv_data.put("key", data.key());
        cv_data.put("subjEntry", data.subjEntry());
        cv_data.put("subjTime", data.subjTime());
       database.insert("tablename",null,cv_data);
       database.close();
    }
    
    
    以下は、SQLiteデータベースからデータを取得するコードです
      public List<Data> getData(String key){
        String columns [] = {
             "key", "subjEntry", "subjTime"
        };
        String sortingOrder = " subjTime ASC";
        List <Data> dataList = new ArrayList <Data>();
        SQLiteDatabase mdDatabase = getWritableDatabase();
        Cursor cursor = mdDatabase.query("tablename",
                columns,
                null,
                null,
                null,
                null,
                sortingOrder);
        if (cursor.moveToFirst()){
            do {
            if(cursor.getString(cursor.getColumnIndex("subjEntry")).equals(Key)){
            }
               Data data = new Data();
               data.setsubjEntry(cursor.getString(cursor.getColumnIndex("subjEntry")));
               data.setsubjTime(cursor.getString(cursor.getColumnIndex("subjTime")));
               dataList.add(data);
            }while (cursor.moveToNext());
        }
        mdDatabase.close();
        cursor.close();
        return dataList;
    }'
    
    

    または、Firebase JobDispatcherを試してください

あなたの答え