【问题标题】:Accessing same PendingIntent in two different blocks在两个不同的块中访问相同的 PendingIntent
【发布时间】:2014-02-02 11:37:15
【问题描述】:

我有 2 个按钮 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,即 @ 块987654328@ 和cancelonClickListener()

注意:我不能把这 3 个放在 onCreate() 上面,因为它会抛出 componentinfo nullpointerexception

问题

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

附言

1.我尝试将它们设为static,但这不起作用。

2.如果我不使用相同的PendingIntent,则无法达到预期的结果(即设置和取消警报)。

【问题讨论】:

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


    【解决方案1】:

    根据您的代码示例,您可以简单地返回一个相同的 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 消息。

    【讨论】:

    • 感谢这个有价值的代码 sn-p 和信息。是的,它确实对我有用。现在我成功设置和取消警报。
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多