这几天在做安卓比武场第三上的定时设置壁纸效果(这个活动不错,希望大家踊跃参加),想要达到多定时的效果,就是设置多个换壁纸的效果。我使用 AlarmManager 进行进行定时发送换壁纸广播,出现了一个问题就是 onreceive 收到都是第一个广播的 intent.
下面我给出关键代码而原代码,有兴趣的读者可以下载代码去运行下,你会发现一个让我昨天到两点多才睡的问题
这些是发送信息的代码
main.java
package com.wjh.test; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class Main extends Activity implements OnClickListener { /** Called when the activity is first created. */ Button btn ; int id = 1; char a = 'a'; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(Main.this,MyReceive.class); //输入action intent.setAction("com.wjh.action"); //输入id intent.putExtra("id", id); //输入字符 intent.putExtra("char",a); PendingIntent pi = PendingIntent.getBroadcast(Main.this, 0, intent, 0); //设置时间 Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); c.add(Calendar.SECOND,5); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); Toast.makeText(this,"第"+id+"次发出"+id+""+a,Toast.LENGTH_SHORT).show(); id++; a++; } }
这个接受信息的代码
MyReceive.java
public class MyReceive extends BroadcastReceiver{ public static int i=0; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if(intent.getAction().equals("com.wjh.action")) { int id = intent.getIntExtra("id", 0); char str = intent.getCharExtra("char", 'b'); Toast.makeText(context,"第"+(++i)+"次"+ id+""+str, Toast.LENGTH_SHORT).show(); } } }
运行的结果是:
发现了吗?虽然发出的数据在变,但是接受到了都是同样的的。
昨天晚上我也被这个东西搞死了,或许你们不可能再为这个问题而烦扰了,因为我现在告诉你为什么会这样 !
就是因为 Broadcast, 因为我们发送广播,是把一个 intent 弄到这里面,但是 broadcast 偷懒了, 只要你放入
Intent 是一样的,那么他发出的永远都是第一个输入的!
所以下面我们来是改变 intent 的 action 来试试效果
我们来改下 main.jafva 文件代码:
//输入action
intent.setAction("com.wjh.action");
改成
//输入action
intent.setAction("com.wjh.action"+id);
下面改下 MyReceive.java 的代码
将整个 onReceive 方法的代码改成下面的 :
public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub int id = intent.getIntExtra("id", 0); char a = intent.getCharExtra("char", 'b'); Toast.makeText(context,"第"+(++i)+"次受到"+ id+""+a, Toast.LENGTH_SHORT).show(); }
那么来看看效果图吧:
看似很简单,但是如果你想要通过 alarmManager 进行传送数据,那么你将悲剧了,因为你收到的永远的都是第一份 , 所以所 Broacast 偷懒,那么 alarmManager 悲剧!
下面我给出两个例子的完整源代码附件: