當前位置:首頁 » 安卓系統 » 安卓如何使用broadcast

安卓如何使用broadcast

發布時間: 2022-05-24 05:28:52

A. 為什麼Android要使用各種BroadcastReceiver

作為Android四大組件之一的BroadcastReceiver(廣播接收者),同Activity(活動)一樣,經常被大家用到,網上也是一堆對它的講解,那麼為什麼Android要用廣播接收者這種機制呢?
廣播分為:普通廣播和有序廣播
1.Normal broadcasts(普通廣播):Normal broadcasts是完全非同步的可以同一時間被所有的接收者接收到。消息的傳遞效率比較高。但缺點是接收者不能將接收的消息的處理信息傳遞給下一個接收者也不能停止消息的傳播。可以利用Context.sendBroadcast發送。
2.Ordered broadcasts(有序廣播):Ordered broadcasts的接收者按照一定的優先順序進行消息的接收。一次傳送到一個接收器。 隨著每個接收器依次執行,它可以將結果傳播到下一個接收器,或者它可以完全中止廣播,使得它不會被傳遞到其他接收器。 命令接收器運行可以用匹配的意圖過濾器的android:priority屬性控制; 具有相同優先順序的接收器將以任意順序運行。可以利用Context.sendOrderedBroadcast發送。
官網上介紹廣播是用的監聽系統網路狀況的例子,其實關鍵字在於「監聽」。
(1) 創建廣播接收者
BroadcastReceiver是一個抽象類,所以我們要創建自己的廣播接收者就要繼承它,繼承後會有提示重寫onReceive方法。
public class NetworkBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isAvailable()) {
Toast.makeText(context, "有網路連接", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "無網路連接", Toast.LENGTH_SHORT).show();
}
}
}
}

廣播接收者的生命周期是從接收廣播開始,到onRecevier方法執行完成結束,時間很短,一般不允許處理大批量耗時操作。這里順便給出列印NetworkInfo的信息以供參考:
NetworkInfo:
type: WIFI[,type_ext: WIFI],
state: CONNECTED/CONNECTED,
reason: (unspecified),
extra: "TP-LINK_EFE8",
roaming: false,
failover: false,
isAvailable: true,
: false,
isIpv4Connected: true,
isIpv6Connected: false

[type: MOBILE[LTE],
state: CONNECTED/CONNECTED,
reason: connected,
extra: cmnet,
roaming: false,
failover: false,
isAvailable: true,
: false]

(2) 靜態注冊廣播
靜態注冊廣播,需要在AndroidManifest.xml中,添加<recevier/> 標簽,將廣播接收者注冊到應用中。要添加過濾器IntentFilter,由於系統網路變化時會發送ConnectivityManager.CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE")的廣播,所以我們要監聽這條廣播。
<receiver android:name=".NetworkBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>

這里priority代表的是執行順序的優先順序,取值[-1000,1000],後面的有序廣播會講到。
(3) 動態注冊廣播
i.意圖過濾器 IntentFilter 用於給BroadcastReceiver綁定監聽廣播類型
ii.自定義的BroadcastReceiver,例如上文的
iii.注冊方法 Context.registerReceiver(Receiver, IntentFilter)
iv.反注冊方法 unregisterReceiver(Receiver)
IntentFilter mFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
mReceiver = new ();
registerReceiver(mReceiver, mFilter);

@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}

這段代碼是成對出現的,可以在onCreate的時候注冊,在onDestroy的時候反注冊,也可以在onResume和onPause中執行這寫方法。不過Google API推薦的做法,在activity的onResume()中注冊,在onPause()反注冊。效果是當界面pause時,就不接收廣播,從而減少不必要的系統開銷。還有就是一定要主動反注冊你的廣播,否則會出現異常。
動態注冊和靜態注冊的差別:動態注冊後,廣播接收者會依賴Activity的生命周期,而靜態注冊的廣播不會,只要是系統有發出的廣播,它都會接收,與程序是否啟動無關。
(4) 發送普通廣播
具體使用的方法是sendBroadcast(Intent intent),通過隱式調用就可以,注意action是你自定義的,意思就是不可以發送系統廣播,我試了,直接就崩了。
Intent intent = new Intent();
intent.setAction("com.fleming.chen.mybroadcast");
sendBroadcast(intent);

針對(3)(4)兩點,如果你要用到的廣播僅僅是應用里的,那麼你可以用LocalBroadcastManager這個類,它與上述描述中的區別在於:
LocalBroadcastManager.getInstance(context).registerReceiver(mReceiver, mFilter);

LocalBroadcastManager.getInstance(context).unregisterReceiver(mReceiver);

LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

通過sendBroadcast發送的廣播,不會被通過LocalBroadcastManager類注冊的廣播接收者接收,反之也是如此,兩者是不可以」互通友誼「的,推薦使用LocalBroadcastManager來管理廣播。
(5) 發送有序廣播
上面講了那麼多都是普通廣播,那什麼又是有序廣播呢?
有序廣播關鍵在於這類廣播是有序的,上文中提到priority,這是IntentFilter的屬性,用來讓不同的廣播擁有不同的執行順序,即優先順序不同。
定義三種不同優先順序的廣播接收者:
public class MyBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.fleming.chen.myreceiver")) {
String message = getResultData();
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
setResultData("這是修改後的數據");//第一個接收後處理一下,再交給下一個
}
}
}

public class MyBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.fleming.chen.myreceiver")) {
String message = getResultData();//得到上一個的處理結果
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
abortBroadcast();//主動停止廣播,不再繼續傳下去
}
}
}

public class MyBroadcastReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.fleming.chen.myreceiver")) {
//此時雖然該廣播接收者也監聽了,不過也沒有內容
Toast.makeText(context, getResultData(), Toast.LENGTH_SHORT).show();
}
}
}

<receiver android:name=".MyBroadcastReceiver" >
<intent-filter android:priority="1000">
<action android:name="com.fleming.chen.myreceiver"/>
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver2">
<intent-filter android:priority="0">
<action android:name="com.fleming.chen.myreceiver"/>
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver3">
<intent-filter android:priority="-1000">
<action android:name="com.fleming.chen.myreceiver"/>
</intent-filter>
</receiver>

Intent intent = new Intent();
intent.setAction("com.fleming.chen.myreceiver");
sendOrderedBroadcast(intent, null, null, null, 0, "這是初始的數據", null);

對於廣播的內容,在Android 7.0上做了修改,即Project Svelte:後台優化
Android 7.0 移除了三項隱式廣播,以幫助優化內存使用和電量消耗。此項變更很有必要,因為隱式廣播會在後台頻繁啟動已注冊偵聽這些廣播的應用。刪除這些廣播可以顯著提升設備性能和用戶體驗。
移動設備會經歷頻繁的連接變更,例如在 WLAN 和移動數據之間切換時。目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播,讓應用能夠監控這些變更。由於很多應用會注冊接收此廣播,因此單次網路切換即會導致所有應用被喚醒並同時處理此廣播。
同理,在之前版本的 Android 中,應用可以注冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。
為緩解這些問題,Android 7.0 應用了以下優化措施:
面向 Android 7.0 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前台運行的應用如果使用 BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。
如果您的應用使用任何 intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android 7.0 設備。Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。例如,JobScheler API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網路)時所執行的網路操作。您甚至可以使用 JobScheler 來適應內容提供程序變化。
所以說,在Android的世界,到處都充滿著廣播,就是為了用來監聽手機的各種狀態,給用戶提醒,這是一種很好的用戶體驗,不過任何事情都是如此,廣播也不可以多用哦,

B. android 能在Service(服務)里發送廣播(Broadcast)嗎詳細介紹一下好嗎謝謝

可以
sendBroadcast這個方法是定義在ContextWrapper里的,而Service是繼承ContextWrapper的。
@Override
public void sendBroadcast(Intent intent) {
mBase.sendBroadcast(intent);
}

發送的時候直接調用
sendBroadcast(new Intent("com.marslei.send_broadcast_in_service"));

C. 當一個廣播消息達到接收者時,android調用broadcastreceiver的什麼方法

這是我以前做過的一個例子,看看能不能給你幫助,給你參考參考吧。。。。 這裡面有三個廣播。。。。 public class Test020502Activity extends Activity implements OnClickListener{ /** Called when the activity is first created1); tv2=(TextView)findViewById(R2); tv3=(TextView)findViewById(R3); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnBroadcastReceive1: //消息接收者的注冊與解除注冊 ToggleButton b1=(ToggleButton)v; if(b1.isClickable()){//要接收廣播,要注冊 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.newer.test020502"); intentFilter.setPriority(500);//當前消息接收者的優先順序 registerReceiver(broadcastReceiver1, intentFilter); }else{//不需要接收廣播,取消注冊 unregisterReceiver(broadcastReceiver1); } break; case R.id.btnBroadcastReceive2: ToggleButton b2=(ToggleButton)v; if(b2.isClickable()){//要接收廣播,要注冊 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.newer.test020502"); intentFilter.setPriority(600);//當前消息接收者的優先順序 registerReceiver(broadcastReceiver2, intentFilter); }else{//不需要接收廣播,取消注冊 unregisterReceiver(broadcastReceiver2); } break; case R.id.btnBroadcastReceive3: ToggleButton b3=(ToggleButton)v; if(b3.isClickable()){//要接收廣播,要注冊 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.newer.test020502"); intentFilter.setPriority(700);//當前消息接收者的優先順序 registerReceiver(broadcastReceiver3, intentFilter); }else{//不需要接收廣播,取消注冊 unregisterReceiver(broadcastReceiver3); } break; case R.id.btnSendOrderBroadcast: //發送排序廣播 Intent intent=new Intent(); intent.setAction("com.newer.test020502"); intent.putExtra("saySome", "Ho~~~~~~~La~~~~~~~"); sendOrderedBroadcast(intent, null); break; case R.id.btnSendBroadcast: Intent intent1 = new Intent(); intent1.setAction("com.newer.sendBroadcast"); intent1.setFlags(1); sendBroadcast(intent1); break; case R.id.btnSendStickyBroadcast: Intent intent2 = new Intent(); intent2.setAction("com.newer.sendStickyBroadcast"); intent2.setFlags(2); sendStickyBroadcast(intent2); break; case R.id.btnStart: Intent intent3=new Intent(Test020502Activity.this,OtherActivity.class); startActivity(intent3); break; default: break; } } }

D. 在安卓開發中,如何從BroadcastReceiver向Activity中傳數據

比如一個activity和一個處理數據的類:ActivityA 和 class B,B給ActivityA傳值。可以在B中定義一個interface,裡面定義一個抽象方法,不妨叫做addDAta(String data)。在ActivityA中實現介面重寫addDAta(String data),當然B也要綁定ActivityA,這樣在B中調用addDAta(String data)時就會把值傳給ActivityA

E. Broadcast廣播可以應用於andrion應用程序有哪些場景

摘要 在 Android 裡面有各種各樣的廣播,比如電池的使用狀態,電話的接收和簡訊的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播並做出程序邏輯的處理。

F. 簡述在android中如何發送廣播消息

1.發送廣播
Intent intent = new Intent(BroadcastAction);
Bundle bundle = new Bundle();
bundle.putString("***", SUCCESS);
bundle.putString("FullPathName", mFullPathName);
intent.putExtras(bundle);
sendBroadcast(intent);
2.在Activity中創建一個內部類MyBroadcastReceiver擴展BroadcastReceiver,並在其中實現onReceive方法。
3.在Activity中聲明一個MyBroadcastReceiver類型的成員變數,並注冊:
private MyBroadcastReceiver myBroadcastReceiver;
...
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BroadcastAction);
registerReceiver(receiver, filter);
4.使用完後要記得釋放
unregisterReceiver(receiver);

註:1和2中的 BroadcastAction要是同一個Action

G. 安卓broadcastreceiver怎麼接收的廣播

1.廣播接收者(BroadcastReceiver)

廣播接收者(BroadcastReceiver)繼承BroadcastReceiver類接收廣播意圖的java類,重寫:
public void onReceive(Context context,Intent intent),其中intent可以獲得傳遞的數據;
廣播意圖就是通過Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intentintent)發送的意圖,通過這個語句,能夠廣播給所有滿足條件的組件,比如intent設置了action="Receiver",則所有在AndroidManifest.xml中設置過<actionandroid:name="Receiver"/>的廣播接收者都能夠接收到廣播;

2.廣播發送者sendBroadcast()

通常廣播發送方就是調用Context.sendBroadcast()的程序,通常廣播發送方都是通過隱式意圖發送出去;

廣播發送方分為普通廣播和有序廣播;
同步廣播:發送方發出後,幾乎同時到達多個廣播接收者處,某個接收者不能接收到廣播後進行一番處理後傳給下一個接收者,並且無法終止廣播繼續傳播;Context.sendBroadcast(intent);
有序廣播:廣播接收者需要提前設置優先順序,優先順序高的先接收到廣播,優先順序數值為-1000~1000,在AndroidManifest.xml的<intent-filterandroid:priority="1">設置;比如存在3個廣播接收者A、B、C、D,優先順序A>B>C>D,因此A最先收到廣播,當A收到廣播後,可以向廣播中添加一些數據給下一個接收者(intent.putExtra()),或者終止廣播 abortBroadcast();Context.sendOrderedBroadcast(intent);

一、同步廣播發送方核心代碼
Intent intent = new Intent();
intent.setAction("Receiver");
Context.sendBroadcast(intent);

有序廣播發送方核心代碼:
Intent intent = new Intent();
intent.setAction("Receiver");
Context.sendOrderedBroadcast(intent,null);

二、廣播接收者核心代碼:
public class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();...
}
}

三 注冊該廣播
AndroidManifest.xml 注冊方式
<receiver android:name=".MyReceiver">
<intent-filter android:priority="1000">
<action android:name="Receiver"/>
</intent-filter>
</receiver>

Java類注冊方式
publicvoid registerBoradcastReceiver()
{
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction("Receiver");
registerReceiver(廣播類對象, myIntentFilter);
}

簡單例子

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Test extends Activity{
private final String ACTION_NAME = "Receiver";
private Button mBtnEvent = null;

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//注冊廣播
registerBoradcastReceiver();
LinearLayout mLinearLayout = new LinearLayout(this);
mBtnEvent= new Button(this);
mBtnEvent.setText("發送廣播");
mLinearLayout.addView(mBtnMsgEvent);

setContentView(mLinearLayout);

mBtnEvent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendTestBroadcast();

}
});
}
//發送廣播
private void sendTestBroadcast()
{
Intent mIntent = new Intent(ACTION_NAME);
mIntent.putExtra("strData", "發送廣播,在這里傳送數據");
sendBroadcast(mIntent);
}
private BroadcastReceiver myReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(ACTION_NAME)){
Toast.makeText(Test.this, "接收測試", 200);
}
}
};
//注冊廣播
public void registerBoradcastReceiver(){
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(ACTION_NAME);
registerReceiver(myReceiver, myIntentFilter);
}
}

H. android廣播沒用使用sendbroadcast怎麼就能發送

1.創建需要啟動的BroadcastReceiver的Intent。 2.調用Context的sendBroadcast()或sendOrderedBroadcast()方法來啟動指定的BroadcastReceiver。 當應用程序發出一個BroadcastIntent之後,所有匹配Intent的BroadcastReceiver都有可能被啟動。 由於BroadcastReceiver本質上屬於一個監聽器,因此實現BroadcastReceiver也非常簡單。只要重寫BroadcastReceiver的onReceiver(Context context,Intent intent)方法即可。 實現了BroadcastReceiver後,就應該指定該BroadcastReceiver能匹配的Intent。此時有兩種方法: 1.使用代碼進行指定,調用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver,IntentFilter filter) 2.在AndroidManifest.xml文件中配置。 《贈人玫瑰手有餘香,祝您好運一生一世,如果回答有用,請點「好評」,謝謝^_^!》

I. android中Activity的方法怎麼用在BroadcastReceiver中

BroadcastReceiver中不是有 context么,可以直接獲得啊。 如果你不想這么做的話,加一個靜態的public static Context c ,實現其 set 和get方法 ,set裡面在初始化時候 MainActivity.c=MainActivity.this; 這樣在你的廣播裡面這樣調用 MainActivity.c.getSystemService();即可。

J. android 音樂播放器程序必須得用broadcast嗎

是的,下面是核心代碼:
package com.siyehualian.musicplay;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
// ListView
private ListView listView;
// 適配器
private SimpleAdapter adapter;
// 數據源
private ArrayList<hashmap<string, string="">> list;
// 當前播放的曲目
private int currentPositionMusic = -1;

// 上一首
private ImageButton lastImageButton;
// 播放
private ImageButton playImageButton;
// 下一首
private ImageButton nextImageButton;
// 循環
private ImageButton loopImageButton;
// 播放進度
private SeekBar playSeekBar;
// 當前播放曲目
private TextView currentPlayingSong;
// 是否是第一次進來
private boolean ifFirstIn = true;

private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
lastImageButton = (ImageButton) findViewById(R.id.imagebutton_previous);
playImageButton = (ImageButton) findViewById(R.id.imagebutton_play);
nextImageButton = (ImageButton) findViewById(R.id.imagebutton_next);
loopImageButton = (ImageButton) findViewById(R.id.imagebutton_loops);
playSeekBar = (SeekBar) findViewById(R.id.seekbar_play);
currentPlayingSong = (TextView) findViewById(R.id.textview_songinformation);
list = new ArrayList<hashmap<string, string="">>();

adapter = new SimpleAdapter(this, list, R.layout.list_item,
new String[] { "title" }, new int[] { R.id.textview_item });
listView.setAdapter(adapter);

// 為listView設置監聽器
listView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<!--?--> arg0, View arg1,
int position, long arg3) {
try {
currentPositionMusic = position;
playMusic();
} catch (Exception e) {
e.printStackTrace();
}
}
});

lastImageButton.setOnClickListener(this);
playImageButton.setOnClickListener(this);
nextImageButton.setOnClickListener(this);
loopImageButton.setOnClickListener(this);
playSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
// 改變進度條
intent = new Intent("changed");
intent.putExtra("seekbarprogress", progress);
startService(intent);
}
}
});
}

private void playMusic() {
// 啟動播放音樂的服務
intent = new Intent("play");
intent.putExtra("uri", ((HashMap<string, string="">) list
.get(currentPositionMusic)).get("path"));
intent.putExtra("title", ((HashMap<string, string="">) list
.get(currentPositionMusic)).get("title"));
startService(intent);
// 把圖片改為播放的圖片
playImageButton.setImageResource(R.drawable.play);
// 同時更改SeekBar的進度,因為進度是不斷變化的,所以需要一個子線程來刷新下
// playSeekBar.setMax(mp.getDuration());
// 設置當前播放曲目信息
currentPlayingSong.setTextColor(Color.GREEN);
currentPlayingSong.setText(list.get(currentPositionMusic).get("title"));
}

@Override
protected void onResume() {
super.onResume();
// 得到所有音頻
if (ifFirstIn) {
ifFirstIn = false;
scanMusic();
}
// 動態注冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction("seekbarmaxprogress");
filter.addAction("seekbarprogress");
filter.addAction("playNextSong");
filter.addAction("pause");
filter.addAction("setplay");
filter.addAction("stoploop");
filter.addAction("startloop");
registerReceiver(broadcastReceiver, filter);
}

@Override
protected void onDestroy() {
super.onDestroy();
// 關閉通知
intent = new Intent("stopnotification");
startService(intent);

// 停止服務
stopService(intent);
// 取消廣播的注冊
unregisterReceiver(broadcastReceiver);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("你確定要退出嗎?");
builder.setPositiveButton("確定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}

/**
* 得多所有的音頻
*/
private void scanMusic() {
// 置空list集合中的所有元素,放置反復啟動導致的數據重復,其實這個部分是因為每次進來都會重新獲得焦點,執行onResume造成的
// 這個修改雖然可以,但是每次進來都有重新載入,增加了手機的符合,所以可以設置一個標志,只有在第一進來的時候才會載入數據
// list.clear();
new Thread() {
public void run() {
Cursor cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

while (cursor.moveToNext()) {
String title = cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String path = cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
String size = cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
if (Long.parseLong(size) > 1024 * 1024) {
HashMap<string, string=""> hashMap1 = new HashMap<string, string="">();
hashMap1.put("title", title);
hashMap1.put("path", path);
list.add(hashMap1);
}
}
cursor.close();
};
}.start();

}

/**
* 監聽
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imagebutton_previous:
playLastSong();
break;
case R.id.imagebutton_play:
intent = new Intent("clickplay");
startService(intent);
break;
case R.id.imagebutton_next:
playNextSong();
break;
case R.id.imagebutton_loops:
intent = new Intent("loops");
startService(intent);
break;
default:
break;
}
}

// 設置當前歌曲為前一首
currentPositionMusic--;
try {
// 播放前一首歌曲
playMusic();
} catch (Exception e) {
e.printStackTrace();
}
}

}
}

/**
* 廣播對象,動態注冊,用來接收從Service傳過來的消息,根據不同的消息做不同的事情
*/
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

熱點內容
在配置更新的時候沒電關機怎麼辦 發布:2024-05-18 20:36:10 瀏覽:926
win7訪問win2000 發布:2024-05-18 20:27:41 瀏覽:387
青島人社局密碼多少 發布:2024-05-18 20:19:10 瀏覽:733
無法存儲呼叫轉移 發布:2024-05-18 20:18:30 瀏覽:125
資料庫的調優 發布:2024-05-18 20:18:29 瀏覽:345
sqlserver注冊表清理 發布:2024-05-18 20:13:14 瀏覽:990
linux刪除連接 發布:2024-05-18 20:06:56 瀏覽:821
linux搭建雲伺服器平台 發布:2024-05-18 19:52:21 瀏覽:401
安卓怎麼關閉美易訂閱 發布:2024-05-18 19:29:16 瀏覽:643
蘋果手機配置代理伺服器怎麼開 發布:2024-05-18 19:29:07 瀏覽:230