Android 在两个不同的块中访问相同的挂起内容
我有两个按钮Android 在两个不同的块中访问相同的挂起内容,android,android-intent,scope,alarmmanager,android-pendingintent,Android,Android Intent,Scope,Alarmmanager,Android Pendingintent,我有两个按钮save and set alarm和cancelalarm,它们完全按照它们的建议执行 我在onCreate()中有以下3行代码 问题 这样声明不会显示任何异常,但它不会让我达到所需的结果。我想在两个不同的代码块中使用相同的pendingent、AlarmManager和Intent,即保存和设置报警和取消的onClickListener() 注意:我不能把这3个放在上面onCreate(),因为它抛出componentinfo nullpointerexception 问题 因此
save and set alarm
和cancel
alarm,它们完全按照它们的建议执行
我在onCreate()
中有以下3行代码
问题
这样声明不会显示任何异常,但它不会让我达到所需的结果。我想在两个不同的代码块中使用相同的pendingent
、AlarmManager
和Intent
,即保存和设置报警和取消的onClickListener()
注意:我不能把这3个放在上面onCreate()
,因为它抛出componentinfo nullpointerexception
问题
因此,我需要在两个不同的块中访问相同的pendingent
、AlarmManager
和Intent
。如何实现这一点
p.S
1.我试图使它们静态,但这不起作用
2.如果我不使用相同的pendingent
则无法达到预期的结果(即设置和取消报警)。给定您的代码示例,您只需返回一个相同的pendingent即可设置报警并取消报警。您列出的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消息。感谢您提供了这段宝贵的代码片段和信息。是的,它确实对我有用。现在我正在成功设置和取消警报。
<?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>