繁体   English   中英

Intent .putExtra使用PendingIntent返回null

[英]Intent .putExtra return null with PendingIntent

此应用程序允许我启动一项服务来提醒我饮酒。 如果我单击通知,我想查看服务是否正在运行,但是使用Intent.putExtra方法没有任何输出。

我的MainActivity类:

Boolean isServiceRunning = false;
AlarmManager alarmManager;
PendingIntent pendingIntent;
TextView mainText;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainText = findViewById(R.id.mainTextView);

    Bundle extras = getIntent().getExtras();
    if (extras == null) {
            mainText.setText("Service is paused");
    } else {
        mainText.setText("Service is running");
    }

}

public void sendNotification(View view) {

    if (!isServiceRunning) {
        isServiceRunning = true;
        Toast.makeText(this, "Reminder service started.", Toast.LENGTH_SHORT).show();
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        mainText.setText("Service is running.");
        Intent i = new Intent(this, reciever.class);
        i.putExtra("isServiceRunning", isServiceRunning.booleanValue());

        pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar calendar = Calendar.getInstance();
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
    } else {
        isServiceRunning = false;
        Toast.makeText(this, "Reminder service ended.", Toast.LENGTH_SHORT).show();
        mainText.setText("Service paused.");
        alarmManager.cancel(pendingIntent);
    }
}

我认为可以使用sharedpreferences解决此问题,但这不是一个好的解决方案。

编辑:

我的广播接收器课程:

public class reciever BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Intent notificationIntent = new Intent(context, drinkReminder.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(drinkReminder.class);
    stackBuilder.addNextIntent(notificationIntent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(100, PendingIntent.FLAG_UPDATE_CURRENT);


    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    Notification notification = new NotificationCompat.Builder(context, CHANNEL_1_ID)
            .setContentTitle("Title")
            .setContentText("description")
            .setSmallIcon(R.drawable.icon_waterdrop)
            .setTimeoutAfter(30000)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .build();

    notificationManager.notify(0, notification);

}

}

代替onCreate()和putExtra()中的代码,您可以在每种情况下创建两个挂起的意图,每个意图使用不同的广播接收器。 在该广播接收器中,您可以打印单独的Toast消息。

MyBroadcastRecieverStart.java

 public class MyBroadcastReceiverStart extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

Toast.makeText(this, "Reminder service started.", Toast.LENGTH_SHORT).show();

}
}

MyBroadcastReceiverStop.java

public class MyBroadcastReceiverStop extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

Toast.makeText(this, "Reminder service ended.", Toast.LENGTH_SHORT).show();

}
}

SendNotification方法-

public void sendNotification(View view) {

if (!isServiceRunning) {
    isServiceRunning = true;

    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    mainText.setText("Service is running.");
    Intent i = new Intent(this, MyBroadcastReceiverStart.class);


    pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar = Calendar.getInstance();
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
} else {
    isServiceRunning = false;

    mainText.setText("Service paused.");
    Intent i = new Intent(this, MyBroadcastReceiverStop.class);


    pendingIntent = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar = Calendar.getInstance();
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);
    alarmManager.cancel(pendingIntent);
}
}

如果您在else块中编写alarmManager.cancel(pendingIntent),它将取消一个不存在的意图,因为您已经在if块中创建了该意图,并且如果else被执行则不会创建该意图,因此我在else中创建了该意图挡也。

您正在将“额外”添加到传递给AlarmManagerIntent中。 这个“额外”将存在于intent中,该onReceive()onReceive()传递给您的BroadcastReceiver ,但您在那里没有对其进行任何操作。

当您单击Notification ,它将启动drinkReminder ,我希望它是一个Activity


您还在评论中说:

你能告诉我一件事吗? 有时,如果我按下按钮启动服务,则大约10秒钟后会出现一条通知,在此之后,它会显示所有10分钟。 我怎样才能解决这个问题?

这是您设置警报的代码:

Calendar calendar = Calendar.getInstance();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
    calendar.getTimeInMillis(), 1000 * 60 * 10, pendingIntent);

调用setRepeating() ,第二个参数指定警报第一次响起,第三个参数指定重复间隔。 您已告知警报管理器,您希望第一个警报立即触发,然后在之后每10分钟触发一次。

如果要在按下按钮10分钟后触发第一个警报,则需要调整第二个参数,使其代表未来10分钟的时间,如下所示:

Calendar calendar = Calendar.getInstance();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
    calendar.getTimeInMillis() + (1000 * 60 * 10), 1000 * 60 * 10, pendingIntent);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM