各位,小弟用闹钟定时器测试PendingIntent的区别,发现没有得到预想的结果。代码如下,希望大家帮我分析下。
功能是:点击button后,启动一个重复定时器:从现在起20秒后,每隔5秒显示一个toast。
1. MainActivity.java
package abc.sjc.xyz;import abc.sjc.xyz.R; //此行可省
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity {
private Button btnSendPendingIntent; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 注册button事件:
btnSendPendingIntent.setOnClickListener(new OnClickListener() { // @Override
public void onClick(View v) {
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
// step1:创建intent
Intent intent = new Intent(getApplicationContext(),
AlermReceiver.class);
intent.putExtra("flag", true); // step2:创建PendingIntent
PendingIntent pi = PendingIntent.getBroadcast(
getApplicationContext(), 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);   //使用 FLAG_UPDATE_CURRENT
// PendingIntent.FLAG_CANCEL_CURRENT); //使用 FLAG_CANCEL_CURRENT
Log.d("MainActivity,setButton: setPendIntent0", pi + "");
// 2秒后发送广播
int triggerAtTime = (int) (SystemClock.elapsedRealtime() + 20 * 1000); // 2秒后 // step3:使用PendingIntent
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
triggerAtTime, 5 * 1000, pi); // interval : 5秒
// alarmMgr.cancel(setPendIntent0);
}
});
}
}2. AlarmReceiver.java//广播接收器
package abc.sjc.xyz;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;public class AlermReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras();
Boolean flag = bundle.getBoolean("flag");
Toast.makeText(context, "进入闹钟:BroadcastReceiver", 100).show();
if (bundle != null) {

Log.i("AlermReceiver:", String.valueOf(bundle.getBoolean("flag")));

Toast.makeText(context, "flag =========++++++ " + flag, 100).show();
}
}
}
两个文件的代码就是如此。我的疑问是:
(1)既然使用FLAG_UPDATE_CURRENT时,不重新生成PendingIntent实例而是使用之前的旧的PendingIntent实例(而不会像FLAG_CANCEL_CURRENT那样,销毁之前的PendingIntent对象然后重新new出一个PendingIntent实例),那么为什么我点击过button并使toast开始每隔5秒就显示后,再点击button时,还需要等待20秒左右后才会开始显示toast?我觉得应该是立刻就能显示啊,因为之前的PendingIntent实例还存在,且重复定时的功能还存在的阿……
等待大家一起指点探讨。broadcastreceiverPendingIntentFLAG_UPDATE_CURRENT