`
一口三个汉堡
  • 浏览: 112902 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Broadcast偷懒,AlarmManager悲剧

阅读更多

 

这几天在做安卓比武场第三上的定时设置壁纸效果(这个活动不错,希望大家踊跃参加),想要达到多定时的效果,就是设置多个换壁纸的效果。我使用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是一样的,那么他发出的永远都是第一个输入的!

所以下面我们来是改变intentaction来试试效果

我们来改下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悲剧!

下面我给出两个例子的完整源代码附件:


 

 

 

  • 大小: 4.3 KB
  • 大小: 4.6 KB
  • 大小: 3.9 KB
  • 大小: 4.2 KB
  • 大小: 4 KB
1
9
分享到:
评论

相关推荐

    AlarmManager + Broadcast 循环启动任务

    1. 通过 AlarmManager 来设置定制任务 2. 用广播去启动Service 3. Service中onStartCommand()方法执行任务

    BroadcastDemo

    AlarmManager am = (AlarmManager) this .getSystemService(Context.ALARM_SERVICE); // Action指向我们的BoxinReceiver Intent intent = new Intent(this, BoxinReceiver.class); PendingIntent pi = ...

    Android Broadcast 广播机制 实例

    在Android系统中,Broadcast(广播)是一种非常重要的组件,它使得应用程序之间能够进行无状态的信息传递,即使这些应用并未在运行。Broadcast机制是Android事件驱动模型的核心部分,它允许应用程序在系统级别发布和...

    BROADCAST ROUTING ALGORITHM_cprogramming_broadcast_

    PROGRAM TO IMPLEMENT BROADCAST ROUTING ALGORITHM

    broadcast功能大集合

    广播(Broadcast)是Android系统中一种重要的组件,用于在应用程序之间传递消息和数据。它具有全局性和异步性,使得即使应用程序不在运行状态,也可以接收到系统或其它应用发送的广播事件。本篇文章将深入探讨...

    broadcast交换机操作指南

    Broadcast光纤交换机尤其在大型网络环境中起着至关重要的作用,因为它们支持高速、长距离的数据传输。以下是对"broadcast交换机操作指南"的详细说明,以及与博科(Brocade)交换机相关的知识点。 1. **Broadcast...

    Android开发之AlarmManager的用法详解

    `PendingIntent`对象是AlarmManager的关键组成部分,它封装了待执行的动作,可以是启动Activity、Service或发送Broadcast。在创建PendingIntent时,需确保其与触发动作的意图匹配,以便在闹钟触发时正确执行。 在...

    Android应用源码之broadcast_broadcast.zip

    在Android系统中,Broadcast(广播)是实现组件间通信的一种重要机制。BroadcastReceiver(广播接收者)是Android四大组件之一,它能监听并接收系统或应用程序发出的各种广播事件,然后根据事件执行相应的处理逻辑。...

    broadcast和service的demo

    在Android系统中,Broadcast(广播)和Service是两个至关重要的组件,它们负责应用程序间的通信以及后台任务的执行。Broadcast主要用于在整个系统中发送和接收消息,而Service则用于在没有用户界面的情况下执行长...

    broadcast_Android 广播机制broadcast用法实例.rar

    在Android系统中,广播(Broadcast)是一种非常重要的组件,它允许应用程序之间进行异步通信,即使这些应用在后台运行或完全未启动。BroadcastReceiver是处理广播的核心类,它监听并响应系统或应用发送的广播意图...

    Broadcast知识点总结

    Broadcast,即广播,是Android系统中一种全局通知机制,它允许应用程序之间相互通信,即使它们并未直接相互关联。BroadcastReceiver是广播的核心组件,用于监听并接收系统或应用发布的广播Intent。 1. **Broadcast...

    Android中关于Broadcast、Intent 的应用

    在Android系统中,Broadcast(广播)和Intent是两个至关重要的组件,它们构成了应用程序间通信的基础。Broadcast用于在应用程序之间传递消息,而Intent则扮演着触发操作的“信使”角色。理解并熟练运用这两个概念,...

    Broadcast demo

    在Android系统中,Broadcast(广播)是一种全局的消息传递机制,它允许应用程序之间进行异步通信。Broadcast demo是一个演示了如何在Android中简单使用Broadcast的示例项目。通过这个项目,我们可以学习到关于...

    Android之Broadcast, BroadcastReceiver(广播)

    - 对于需要在系统休眠状态下仍能接收到广播的场景,可以使用AlarmManager结合PendingIntent实现,但这会消耗更多的系统资源。 - 从Android 8.0(API级别26)开始,对非显式广播进行了限制,只有针对系统组件和已...

    Android学习之Broadcast练习_dlc

    在Android开发领域,四大组件是应用的核心组成部分,其中包括Broadcast(广播)。Broadcast Receiver(广播接收者)是Android系统中用于在应用程序之间传递消息的一种机制。它允许应用在后台接收和响应系统或其它...

    Broadcast示例代码

    在Android系统中,Broadcast(广播)是四大组件之一,它是一种全局的消息传递机制,使得应用程序之间可以进行异步通信。BroadcastReceiver(广播接收者)是处理这些广播消息的组件,即使应用在后台运行或者完全关闭...

    broadcast

    在IT行业中,广播(Broadcast)通常指的是网络通信中的一种机制,允许一个节点向网络上的所有其他节点发送消息,而无需知道每个接收者的具体地址。在本文中,我们将深入探讨广播的概念,以及它在服务器(server)和...

    Broadcast广播的使用

    在Android系统中,Broadcast(广播)是一种非常重要的组件,它允许应用程序之间进行异步通信,无需两者之间有明确的依赖关系。BroadcastReceiver(广播接收器)是处理这些广播的核心类。下面将详细介绍Broadcast的...

Global site tag (gtag.js) - Google Analytics