在两个不同的块中访问相同的PendingIntent

时间:2014-02-02 11:37:15

标签: android android-intent scope alarmmanager android-pendingintent

我有两个按钮save and set alarmcancel警报,这些按钮的确可以完全按照他们的建议行事。

我在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);

问题

这样声明没有显示任何异常,但它不会让我达到所需的结果。我想在两个不同的块中使用相同的PendingIntentAlarmManagerIntent代码,即save and set alarmcancel onClickListener()的块。

注意:我不能将{3}置于onCreate()之上,因为它会引发componentinfo nullpointerexception

问题

所以我需要在2个不同的区块中访问相同的PendingIntentAlarmManagerIntent。如何实现这一目标?

P.S

1.我试图让它们static,但这不起作用。

2.如果我不使用相同的PendingIntent,则无法实现所需的结果(即设置和取消警报)。

1 个答案:

答案 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消息。