六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

Broadcast偷懒,AlarmManager悲剧

[复制链接]

升级  42%

31

主题

31

主题

31

主题

秀才

Rank: 2

积分
113
 楼主| 发表于 2013-1-26 14:29:11 | 显示全部楼层 |阅读模式
 
<div class="Section0">
这几天在做安卓比武场第三上的定时设置壁纸效果(这个活动不错,希望大家踊跃参加),想要达到多定时的效果,就是设置多个换壁纸的效果。我使用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);    }@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(Main.this,MyReceive.class);//输入actionintent.setAction("com.wjh.action");//输入idintent.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 stubif(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(); } }}  


运行的结果是:




 
 

 

发现了吗?虽然发出的数据在变,但是接受到了都是同样的的。

[size=8.0000pt]昨天晚上我也被这个东西搞死了,或许你们不可能再为这个问题而烦扰了,因为我现在告诉你为什么会这样!

[size=8.0000pt]就是因为Broadcast,因为我们发送广播,是把一个intent弄到这里面,但是broadcast偷懒了,[size=8.0000pt]只要你放入

[size=8.0000pt]Intent是一样的,那么他发出的永远都是第一个输入的!

[size=8.0000pt]所以下面我们来是改变intent的action来试试效果

[size=8.0000pt]我们来改下main.jafva文件代码:

 
//输入actionintent.setAction("com.wjh.action");  
 

[size=10.5000pt]改成

 
//输入actionintent.setAction("com.wjh.action"+id);  
[size=10.5000pt]下面改下MyReceive.java的代码

[size=10.5000pt]将整个onReceive方法的代码改成下面的:


public void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubint id = intent.getIntExtra("id", 0);char a = intent.getCharExtra("char", 'b');Toast.makeText(context,"第"+(++i)+"次受到"+ id+""+a, Toast.LENGTH_SHORT).show();}  
[size=10.5000pt]那么来看看效果图吧:





 

 

 
[size=10.5000pt]看似很简单,但是如果你想要通过alarmManager进行传送数据,那么你将悲剧了,因为你收到的永远的都是第一份,所以所Broacast偷懒,那么alarmManager悲剧!

[size=10.5000pt]下面我给出两个例子的完整源代码附件:



 

 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表