我有两个按钮save and set alarm
和cancel
警报,这些按钮的确可以完全按照他们的建议行事。
我在onCreate()
内有以下3行代码。
final Intent alarmintent = new Intent(AlarmActivity.this, AlarmReceiver.class);
final AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
final PendingIntent sender1 = PendingIntent.getBroadcast(getApplicationContext(), 2, alarmintent, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA);
问题
这样声明没有显示任何异常,但它不会让我达到所需的结果。我想在两个不同的块中使用相同的PendingIntent
,AlarmManager
和Intent
代码,即save and set alarm
和cancel
onClickListener()
的块。
注意:我不能将{3}置于onCreate()
之上,因为它会引发componentinfo nullpointerexception
。
问题
所以我需要在2个不同的区块中访问相同的PendingIntent
,AlarmManager
和Intent
。如何实现这一目标?
P.S
1.我试图让它们static
,但这不起作用。
2.如果我不使用相同的PendingIntent
,则无法实现所需的结果(即设置和取消警报)。
答案 0 :(得分:1)
根据您的代码示例,您可以简单地找回相同的PendingIntent,您可以使用该PendingIntent设置警报并取消警报。您列出的getBroadcast行允许您执行此操作:
PendingIntent.getBroadcast(getApplicationContext(), 2, alarmintent, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA);
有关更完整的示例,请参阅以下IntentSender和AlarmReceiver类:
public class IntentSender extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pending_intent);
Button setAlarmButton = (Button) findViewById(R.id.set_alarm_button);
Button cancelAlarmButton = (Button) findViewById(R.id.cancel_alarm_button);
setAlarmButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Intent alarmintent = new Intent(IntentSender.this, AlarmReceiver.class);
final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
final PendingIntent sender1 = getPendingIntent(alarmintent);
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, sender1);
}
});
cancelAlarmButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Intent alarmintent = new Intent(IntentSender.this, AlarmReceiver.class);
final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
final PendingIntent sender1 = getPendingIntent(alarmintent);
alarmManager.cancel(sender1);
}
});
}
private PendingIntent getPendingIntent(final Intent alarmintent) {
return PendingIntent.getBroadcast(getApplicationContext(), 2, alarmintent, PendingIntent.FLAG_UPDATE_CURRENT |
Intent.FILL_IN_DATA);
}
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Received the broadcast!", Toast.LENGTH_SHORT).show();
}
}
这是一个带有两个按钮的布局,您可以单击设置并取消警报:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/set_alarm_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set Alarm" />
<Button
android:id="@+id/cancel_alarm_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel Alarm" />
</LinearLayout>
继续尝试一下。单击“设置警报”按钮,等待2秒,您应该看到一个Toast。对于第二次测试,单击“设置警报”,然后快速单击“取消警报”。你不应该看到Toast消息。