?
這幾天在做安卓比武場第三上的定時設置壁紙效果(這個活動不錯,希望大家踴躍參加),想要達到多定時的效果,就是設置多個換壁紙的效果。我使用 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 悲劇!
下面我給出兩個例子的完整源代碼附件:
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
