当前位置:首页 » 安卓系统 » 安卓如何使用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() {

热点内容
sqlserver2005命令 发布:2025-07-04 06:27:08 浏览:731
压缩文件啥样 发布:2025-07-04 06:21:42 浏览:297
linux的回车换行 发布:2025-07-04 06:21:39 浏览:131
c语言的窗口 发布:2025-07-04 06:20:54 浏览:982
androidk线图 发布:2025-07-04 06:19:15 浏览:130
华为荣耀6短信加密 发布:2025-07-04 06:18:30 浏览:814
sqlserver2008链接 发布:2025-07-04 06:15:54 浏览:906
ueditor的图片上传 发布:2025-07-04 06:09:09 浏览:539
iis7匿名访问 发布:2025-07-04 05:53:33 浏览:319
ftp服务器被动模式配置 发布:2025-07-04 05:17:32 浏览:334