【问题标题】:Android: How to get requestCode inside alarm receiver when Alarm ringsAndroid:警报响起时如何在警报接收器中获取requestCode
【发布时间】:2014-09-27 14:51:19
【问题描述】:

用户可以设置多个警报。在这种情况下,我将警报数据存储到数据库中并创建一个具有唯一requestCodePendingIntent。实际上,我将数据库的行 ID 用作requestCode,当警报触发时,我可以从数据库中获取特定警报的其他信息。

从我设置意图的地方:

private void setInstantAlarm(Calendar timeFromNow, int pos){
    try{
        Intent intent = new Intent(context, AlarmReceiverActivity.class);
        PendingIntent pendingIntent =
                PendingIntent.getActivity(context, pos, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, timeFromNow.getTimeInMillis(), pendingIntent);

    }catch (NumberFormatException e){
        Toast.makeText(context, "Something went wrong!", Toast.LENGTH_SHORT).show();
    }
}

在我的警报接收器类中,我想要我设置为 requestCode 的行 ID:

public class AlarmReceiverActivity extends Activity {
    private MediaPlayer mMediaPlayer;
    private PowerManager.WakeLock mWakeLock;

    @Override
    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Wake Log");
        mWakeLock.acquire();

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,

                WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        setContentView(R.layout.alarm);

        Button stopAlarm = (Button) findViewById(R.id.btnStopAlarm);
        stopAlarm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMediaPlayer.stop();
                finish();
            }
        });
        playSound(this, getAlarmUri());
    }

    private  void playSound(Context context, Uri alert){
        mMediaPlayer = new MediaPlayer();
        try{
            mMediaPlayer.setDataSource(context, alert);
            final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0){
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
                mMediaPlayer.prepare();
                mMediaPlayer.start();
            }
        }catch (IOException e){
            Log.i("AlarmReceiver", "No audio files are Found!");
        }
    }

    private Uri getAlarmUri(){
        Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alert == null){
            alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            if (alert == null){
                alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            }
        }
        return  alert;
    }

    protected  void onStop(){
        super.onStop();
        mWakeLock.release();
    }
}

那么我怎样才能得到 requestCode 的待处理意图或 AlarmReceiverActivity 类中的行 ID?

【问题讨论】:

  • 你的意思是 pos 在你的情况下的价值?
  • @kaze:是的,我需要这个值。

标签: android android-intent


【解决方案1】:

在创建意图时,将 Extra 添加到其中:

Intent intent = new Intent(context, AlarmReceiverActivity.class);
intent.putExtra("requestCode",pos);
PendingIntent pendingIntent =
            PendingIntent.getActivity(context, pos, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, timeFromNow.getTimeInMillis(), pendingIntent);

在接收器中:

@Override
public void onReceive(Context pContext, Intent pIntent){
    // retrieve the value
    int code= pIntent.getIntExtra("requestCode", 1);

}

【讨论】:

  • @rony36 检查编辑。如果在此之后发现任何问题,请写下问题。
  • 哦,太好了!我做到了。使用getIntent().getExtras().getSerializable("requestCode")
  • 不错不错。无论如何,pIntent.getIntExtra("requestCode", 1); 不起作用吗?
  • 实际上我是java新手,我很困惑在哪里把这个代码块放在接收器中。我把它放在onCreate 方法下面,但它没有触发。我在这个onReceive 方法中设置了一些断点,但它没有在那里触发!!我不知道我做错了什么。
  • ow ow ow ...我已经完成了这项工作。非常感谢你的帮助。 :)
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多