Android Broadcast机制深入解析
2013-02-27 14:43
387 查看
众所周知,Android的四大组件是Activity,Service,ContentProvider和Broadcast。可见Broadcast的重要性。何谓广播机制,我想大家对广播肯定不陌生,发出去的广播,是没有任何目的性的,没有一个明确的目标,至于谁会收到,发送广播的人肯定不会知道。android中的broadcast也是如此,一个activity发出广播,也并不知道哪个activity会响应。那么是什么样的activity会响应呢?一个activity是如何发送广播呢?对于广播我们又该如何处理呢?下面我们来一步一步了解。
首先,一个activity是如何发出一个广播的?是通过sendBroadcast()函数,函数的参数为一个intent对象,该对象最重要的是定义了动作,将广播发送出去后,能够处理该动作的其他activity便能够接收广播,并作出响应。
那么其他的activity是如何知道自己该接受什么动作呢?
是通过过滤器fliter。在filter中定义了能够响应的所有动作,如果广播发出的动作存在于filter当中,该activity就响应,反之忽略广播。
那么,接受了广播之后,该activity又该执行什么操作呢?
这里我们要说一下,对广播的响应我们是通过类BroadcastReceiver来实现的,我们通过继承该类,并重载其onReceive方法,能够自定义执行后该做的处理。
我们还需要了解什么是动作
所谓动作,即action,其实大体上说就是对要进行操作的描述。android给我们自定义了很多动作,例如ACTION_EDIT,ACTION_VIEW,等等。它们对即将进行的操作进行了描述,就像ACTION_EDIT,就将操作描述为编辑。那么能够实现编辑功能的activity就会响应。系统定义的action有很多,在此不再赘述,大家想要详细了解的话可以参考官方文档。那么除了官方提供的,我们用得更多的还是我们自定义的action,自己对要实现的动作做一个描述,通常的表示方法为“包名”+“.”+“动作描述”。例如:“com.suns.HTTPRequestActivity.BUTTONCHANGE”,分解开即”com.suns.HTTPRequestActivity“+“.”+"BUTTONCHANGE"。就自定义了一个按钮变化的action。其实这只是一个命名规律的字符串罢了,为的只是让intent和fliter能够对应,还有让人们知道这个动作是干嘛的。
广播能用几种方法实现呢?它们有什么区别联系?
实现广播的方法有两种。一种是在androidmanifest.xml当中去注册广播,另一种方法是在代码中动态注册广播,这两种方法虽然都能实现广播机制,但是还是有很大不同,所以运用也要分情况。如果我们在androidmanifest.xml中去定义的话,那么该广播是在activity结束之后也不会结束的,原因在于它已经写在了manifest.xml文件当中,也就是注册到了系统当中,所以无论你的activity是否存在,对于该广播没有影响。而在java代码中动态注册广播,在该activity结束后,我们可以注销该广播,也就是它随着activity的消失而消失。这样解释,大家都应该清楚了。如果是一些系统应用,比如手机没电后震动啊,后台计算流量啊这样的功能,需要一直存在的,我们可以在androidmanifest.xml中注册,而一些只有该activity存在时才有意义的广播,比如更改界面等等,就用动态注册比较合适,activity都没了。该广播还有什么用呢?只会浪费资源而已。
好了,说了这么多,我们还是需要用一个例子去应用一下它。
首先先是动态注册广播的,点击界面上的button后,发送更改button的广播,然后button变为进度条。
代码如下:
Broadcasttest.java:
Java代码
package com.suns.ButtonChanged;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.view.View;
public class Broadcasttest extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
ButtonChangedActivity.getButton().setVisibility(View.GONE);
ButtonChangedActivity.getBar().setVisibility(View.VISIBLE );
}
}
ButtonChangeActivity.java:
Java代码
package com.suns.ButtonChanged;
import android.app.Activity;
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.ProgressBar;
public class ButtonChangedActivity extends Activity {
/** Called when the activity is first created. */
private static Button button=null;
private static ProgressBar bar=null;
private Broadcasttest t;
private IntentFilter filter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
bar=(ProgressBar)findViewById(R.id.bar);
button.setOnClickListener(new ButtonClick());
}
public static Button getButton()
{
return button;
}
public static ProgressBar getBar()
{
return bar;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
ButtonChangedActivity.this.unregisterReceiver(t);
}
class ButtonClick implements OnClickListener
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
t=new Broadcasttest();
filter=new IntentFilter();
filter.addAction(Intent.ACTION_EDIT);
Intent intent=new Intent();
intent.setAction(Intent.ACTION_EDIT );
ButtonChangedActivity.this.registerReceiver(t, filter);
ButtonChangedActivity.this.sendBroadcast(intent);
}
}
}
我们用registerReceiver函数去注册一个广播响应事件,有两个参数,第一个是我们自定义的receiver对象,第二个即是过滤器。
注意:我们要在activity的onDestroy()方法中注销该广播!
main.xml:
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="点击"
/>
<ProgressBar
android:id="@+id/bar"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyle"
/>
</LinearLayout>
效果图:
点击后:
然后我们再写一个在androidmanifest.xml中静态注册广播的例子,上例情形已经不再适合(原因参见上文)。
Broadcasttest_Two.java
Java代码
package com.suns.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class Broadcasttest_Two extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Log.i("MY_LOG", "this is a broadcast example");
}
}
Broadcast_twoActivity.java
Java代码
package com.suns.broadcast;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Broadcast_twoActivity extends Activity {
/** Called when the activity is first created. */
private Button button=null;
final private String Send="com.suns.Broadcast_twoActivity.SEND";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
button.setText("点击发送广播");
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent =new Intent();
intent.setAction(Send);
Broadcast_twoActivity.this.sendBroadcast(intent);
}
});
}
}
main.xml:
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
AndroidManifest.xml:
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.suns.broadcast"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".Broadcast_twoActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="Broadcasttest_Two">
<intent-filter>
<action android:name="com.suns.Broadcast_twoActivity.SEND"></action>
</intent-filter>
</receiver>
</application>
</manifest>
效果图:
点击后:
好了,关于android中的broadcast我就介绍到这里,谢谢你的观看。
相关文章推荐
- [Android Broadcast]机制深入解析
- Android Broadcast机制深入解析
- Android中图片加载框架Glide解析3----深入探究Glide的缓存机制
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
- Android消息机制--Handler 深入解析(JAVA层)
- Android源码解析系列第(三)篇---深入了解Android的消息机制
- Android Handler 异步消息处理机制二:源码解析,深入理解Looper、Handler、Message三者关系
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
- 深入解析Android中Handler消息机制
- Android源码解析Handler系列第(三)篇---深入了解Android的消息机制
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
- Android之事件分发机制深入理解与详细解析(View)
- 深入解析Android中Handler消息机制
- Android之事件分发机制深入理解与详细解析(ViewGroup)
- 阅读深入解析Android RIL笔记2 —RILC系统结构及LibRIL运行机制
- Android View深入解析(二)事件分发机制
- Android源码解析之广播(Broadcast)机制简要介绍和学习计划
- 深入理解Android消息机制,从源码解析Handler,Looper,MessageQueue