`
king_tt
  • 浏览: 2102052 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android中的广播Broadcast详解

 
阅读更多

今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低、开机、锁屏等一些操作都会发送一个广播,具体的Android系统中的广播可以参见我的另外一篇博客:http://blog.csdn.net/jiangwei0910410003/article/details/17218985.

下面就来详细讲解一下广播机制:

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-10001000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给CA得到广播后,可以往广播里存入数据,当广播传给B,B可以从广播中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。


广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。要实现一个广播接收者方法如下:

第一步:定义广播接收者,继承BroadcastReceiver,并重写onReceive()方法。

public class IncomingSMSReceiver extendsBroadcastReceiver {
  @Override public void onReceive(Contextcontext, Intentintent) {
  }
}

第二步:订阅感兴趣的广播Intent,订阅方法有两种:

第一种:使用代码进行订阅(动态订阅)

IntentFilter filter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = newIncomingSMSReceiver();
registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅(静态订阅)

<receiver android:name=".IncomingSMSReceiver">
   <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
   </intent-filter>
</receiver>


下面看一下动态广播订阅和静态广播订阅的却别:

静态订阅广播又叫:常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到,他的注册方式就是在你的应用程序中的AndroidManifast.xml进行订阅的。

动态订阅广播又叫:非常驻型广播,当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume中订阅广播,同时你必须在onDestory或者onPause中取消广播订阅。不然会报异常,这样你的广播接收器就一个非常驻型的了。

这里面还有一个细节那就是这两种订阅方式,在发送广播的时候需要注意的是:动态注册的时候使用的是隐式intent方式的,所以在发送广播的时候需要使用隐式Intent去发送,不然是广播接收者是接收不到广播的,这一点要注意。但是静态订阅的时候,因为在AndroidMainfest.xml中订阅的,所以在发送广播的时候使用显示Intent和隐式Intent都可以(当然这个只针对于我们自己定义的广播接收者),所以以防万一,我们一般都采用隐式Intent去发送广播。


下面看一下例子:

看一下项目结构:


看一下静态订阅广播:

package com.broadcast.demo;

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;

import com.example.androidbroadcastdemo.R;

/**
 * 静态订阅广播
 * @author weijiang204321
 *
 */
public class StaticRegisterBroadcastActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btn = (Button)findViewById(R.id.btn);
		
		btn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				//使用静态的方式注册广播,可以使用显示意图进行发送广播
				Intent broadcast = new Intent("com.broadcast.set.broadcast");
				sendBroadcast(broadcast,null);
			}
			
		});
	}
	
}


在AndroidMainfest.xml中订阅:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidbroadcastdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    
    <!-- 权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.broadcast.demo.StaticRegisterBroadcastActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- 无序广播注册START  -->
        <receiver android:name="com.broadcast.receiver.UnSortBroadcastReceiver">
            <intent-filter >
                <action android:name="com.broadcast.demo.mybroadcast"/>
            </intent-filter>
        </receiver>
        <!-- 无序广播注册END -->
        
        <!-- 有序广播的注册START -->
        <receiver android:name="com.broadcast.receiver.SortBroadcastReceiverA">
            <intent-filter android:priority="999">
                <action android:name="com.broadcast.set.broadcast"/>
            </intent-filter>
        </receiver>
        
        <!-- 接收短信广播 -->
        <receiver android:name="com.broadcast.receiver.SortBroadcastReceiverB">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
        <!-- 有序广播的注册END -->
        
        <!-- 上传短信内容的Service -->
        <service android:name="com.broadcast.service.UploadSMSService">
            <intent-filter >
                <action android:name="com.broadcast.service.uploadsmsservice"/>
            </intent-filter>
        </service>
        
    </application>

</manifest>

先不要管其他的内容了,后面会讲到,这里只关注静态广播的注册

<!-- 无序广播注册START  -->
       <receiver android:name="com.broadcast.receiver.UnSortBroadcastReceiver">
            <intent-filter >
                <action android:name="com.broadcast.demo.mybroadcast"/>
            </intent-filter>
        </receiver>
<!-- 无序广播注册END -->


下面来看一下广播的接收者:

package com.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 广播接收者
 * @author weijiang204321
 *
 */
public class UnSortBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.e("Intent_Action:",intent.getAction()+"");
	}

}
在广播接收者中的onReceive方法中的逻辑很简单,就是打印Action的内容。

运行程序,结果很简单,这里就不上图片了。


下面来看一下动态订阅:

package com.broadcast.demo;

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 com.broadcast.receiver.UnSortBroadcastReceiver;
import com.example.androidbroadcastdemo.R;

/**
 * 使用动态的方式注册广播
 * @author weijiang204321
 *
 */
public class DynamicRegisterBroadcastActivity extends Activity {
	
	public static final String NEW_LIFEFORM_DETECTED = "com.dxz.broadcasttest.NEW_LIFEFORM";
	protected  UnSortBroadcastReceiver receiver;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btn0 = (Button) findViewById(R.id.btn);
		btn0.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				//发送广播
				Intent it = new Intent(NEW_LIFEFORM_DETECTED);
				sendBroadcast(it);
			}
		});
	}

	@Override
	protected void onResume() {
		super.onResume();
		//注册广播
		IntentFilter counterActionFilter = new IntentFilter(NEW_LIFEFORM_DETECTED);
		receiver = new UnSortBroadcastReceiver();
		registerReceiver(receiver, counterActionFilter);
	}

	@Override
	protected void onPause() {
		super.onPause();
		//取消广播
		unregisterReceiver(receiver);
	}
}
这里我们是在onResume中进行订阅广播,在onPause中取消订阅广播。

AndroidMainfest.xml中将启动的Activity改成DynamicRegisterBroadcastActivity,其他的内容不需要修改,运行程序,打印结果很简单,这里就不上图了。


下面来看一下有序广播和无序广播

这个我们在开始的时候已经说到了,下面来看一下无序广播:

首先我们定义两个广播接收者:

第一个广播接收者:

package com.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 广播接收者A
 * @author weijiang204321
 *
 */
public class SortBroadcastReceiverA extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.e("Demo:","广播接收者A");
	}

}
第二个广播接收者:

package com.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 广播接收者B
 * @author weijiang204321
 *
 */
public class SortBroadcastReceiverB extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.e("Demo:","广播B");
	}

	
	
}


在AndroidMainfest.xml中订阅广播

 <receiver android:name="com.broadcast.receiver.SortBroadcastReceiverA">
            <intent-filter android:priority="999">
                <action android:name="com.broadcast.set.broadcast"/>
            </intent-filter>
</receiver>
        
<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverB">
            <intent-filter android:priority="1000">
                <action android:name="com.broadcast.set.broadcast"/>
            </intent-filter>
</receiver>
运行结果:


运行结果有点奇怪,为什么是接收者B在前面,接收者A在后面,原因就是我们在AndroidMainfest.xml中订阅广播的时候在intent-filter设置了android:priority属性值,值越大优先级越高,接收者B的优先级是1000,接收者A的优先级是999,所以是B先接收到广播,然后A才接收到,但是接收者B和接收者A之间没有联系,也不能有交互的,因为是这是无序广播,是异步的,我们可以做个试验就是在B中的onReceiver方法中添加代码:

abortBroadcast();//终止此次广播的传输

运行结果:


我们可以看到提示错误,就是non-ordered broadcast无序广播不允许终止广播,其实终止也没有用,因为接收者A还是接收到广播了。


下面来看一下有序广播,代码需要做一下修改:

首先是在发送广播的时候:

Intent broadcast = new Intent("com.broadcast.set.broadcast");
sendOrderedBroadcast(broadcast,null);
然后在B接收者中的添加终止广播的方法:

abortBroadcast();

其他的代码不需要修改,运行结果:


只有B接收者了,A接收者没有接收到广播了,因为在B接收者中将广播给终止了,后面的接收者都接受不到了。

下面在修改一下代码:

接收者B:

package com.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * 广播接收者B
 * @author weijiang204321
 *
 */
public class SortBroadcastReceiverB extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.e("Demo:","广播接收者B");
		Bundle bundle = new Bundle();
		bundle.putString("next_receiver", "下一个广播接收者");
		setResultExtras(bundle);
	}
	
}
B接收到广播后,存入一些值,传给下一个接收者。


接收者A的代码:

package com.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * 广播接收者A
 * @author weijiang204321
 *
 */
public class SortBroadcastReceiverA extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.e("Demo:","广播接收者A");
		Bundle bundle = getResultExtras(true);
		String content = bundle.getString("next_receiver");
		Log.e("Demo:",content+"");
		
	}

}
运行结果如下:


接收者A收到了上一个接收者B传递的信息,这个信息可以保留到后面的所有接收者,直到广播终止。

上面讲到的就是有序广播的特点,可以看出是一个同步的动作,接收者之间可以进行数据的交互(上一个传递数据给下一个),也可以控制广播的终止。


下面来做一个案例就是网上很多人弄过的:短信拦截

系统在收到短信的时候,会发送一个:android.provider.Telephony.SMS_RECEIVED这样的广播,而且这是一个有序的广播,所以我们就可以拦截了这条短信,因为系统中的短信接收者的订阅优先级不是1000最高的,所以我们可以自己定义一个短信接收者,将订阅优先级设置成1000,这样我们就可以最先获取到短信内容,然后将截取到知道号码的短信内容上传到服务器上进行保存,然后终止广播。让系统接收不到这条短信。

这里面我们还需要了解的技术就是短信内容的获取,这个我们在代码中解释:

下面来看一下我们定义的短信接收者:

package com.broadcast.receiver;

import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
import com.broadcast.service.UploadSMSService;

/**
 * 广播接收者A
 * @author weijiang204321
 *
 */
public class SortBroadcastReceiverA extends BroadcastReceiver{

	@SuppressLint("SimpleDateFormat")
	@Override
	public void onReceive(Context context, Intent intent) {
		//获取短信的相关信息,使用字段pdus
		Object[] pdus = (Object[]) intent.getExtras().get("pdus");
		StringBuilder content = new StringBuilder();
		String receiveTime = "";
		String senderNumber = "";
		for(Object p : pdus){
			byte[] pdu = (byte[]) p;
			SmsMessage message = SmsMessage.createFromPdu(pdu);
			content.append(message.getMessageBody());
			Date date = new Date(message.getTimestampMillis());
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			receiveTime = format.format(date);
			senderNumber = message.getOriginatingAddress();
		}
		
		Log.e("Demo:","上传短信内容是:"+content.toString());
		Log.e("Demo:","接收短信的时间是"+receiveTime);
		Log.e("Demo:","发送短信的号码是:"+senderNumber);
		
		//拦截的号码是:18910958627,注意前面还有+86是中国地区的编号
		if("+8618910958627".equals(senderNumber)){
			//拦截成功 ,上传信息
			Intent service = new Intent(context,UploadSMSService.class);
			service.putExtra("content", content.toString());
			service.putExtra("receiveTime",receiveTime);
			service.putExtra("senderNumber", senderNumber);
			context.startService(service);
		}
		
	}

}
在onReceive方法中我们通过intent中的Bundle获取短信的相关信息。

下面在看一下上传短信信息的服务Service:

package com.broadcast.service;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

/**
 * 上传短信内容的service
 * @author weijiang204321
 *
 */
public class UploadSMSService extends Service{

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		//获取短信内容和接收时间,发送者的号码
		final String content = intent.getStringExtra("content");
		final String receiveTime = intent.getStringExtra("receiveTime");
		final String senderNumber = intent.getStringExtra("senderNumber");
		
		new Thread(){
			@Override
			public void run(){
				sendSMS(content,receiveTime,senderNumber);
				//上传完成之后就结束service
				stopSelf();
			}
		}.start();
		
		return super.onStartCommand(intent, flags, startId);
	}
	
	/**
	 * 上传短信内容
	 * @param content
	 * @param receiveTime
	 * @param senderNumber
	 * @return
	 */
	private boolean sendSMS(String content, String receiveTime, String senderNumber) {
		try{
			String params = "content="+ URLEncoder.encode(content, "UTF-8")+"&receivetime="+ receiveTime+ "&sendernumber="+ senderNumber;
			byte[] entity = params.getBytes();
			String path = "http://10.2.86.33:8080/ReceiveSMSContent/ReceiveSMSServlet";
			HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
			conn.setConnectTimeout(5000);
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
			conn.getOutputStream().write(entity);
			if(conn.getResponseCode() == 200){
				return true;
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}


}
这个服务的逻辑也很简单的,在获取到短信信息的时候,将内容进行上传。

最后不能忘了在AndroidMainfest.xml中添加权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
订阅短信广播:

<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverA">
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
</receiver>

当然这里还需要有一个短信内容的接收服务端,在服务端定义一个Servlet来接受数据,具体的服务端的环境搭建,自己上网搜索相关资料进行搭建:

package com.servlet.receivesms;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ReceiveSMSServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		String content = req.getParameter("content");
		String receiveTime = req.getParameter("receivetime");
		String phoneNumber = req.getParameter("sendernumber");
		System.out.println("发送内容:"+content);
		System.out.println("发送时间:"+receiveTime);
		System.out.println("发送号码:"+phoneNumber);
		super.doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		super.doPost(req, resp);
	}

}
测试结果,客户端拦截的号码是18910958627,注意前面有+86是中国区域的编码,服务端接收数据为:


这样就表示截取短信内容成功,并且成功上传到服务器上了。


对于上面的短信拦截的功能还有待加强,就是现在想把短信的内容拦截下来,进行篡改,然后再发给下一个接收者?

方案一:在我们定义的短信广播接收者中,我们能够从intent中的Bundle中通过key="pdus"来获取短信内容的,那么我们可以自己从新组建一个新的Bundle,在这个Bundle中存入我们篡改的信息,然后替换之前的Bundle

问题:实施了,但是问题是Bundle是替换不了的,不知道是什么原因?


方案二:由于第一种方案的失败,导致了我从新想到一个方案就是截取短信内容之后,终止此次广播,然后发送一条短信,这时候短信的内容为我们篡改的内容,但是这里需要注意的是,要做判断,因为我们定义的短信接收者的优先级最高,所以我们发送篡改后的短信又被我们的短信接收者给拦截了,但是我们是不想这样的,所以要做个判断,这个很简单的,使用SharePerenced存入一个boolean值就行了。

问题:本来以为这种方案是完美了,但是问题是发送信息的时候,系统提供的方法中的参数是:接收者号码,发送者号码,短信内容,还有其他的参数就不解释了,这很简单呀,我们现在正好需要这三个参数,立马传递进去,结果是收取不到短信,查看文档,发现那个发送者号码的参数是短信服务中心的号码(也不知道什么意思),当把它设置成null的时候短信就可以发出去了,但是设置成null的话,就不能说是谁发的短信了没有意义呀!


现在很纠结,问题还没有解决,如果有哪位大神有好的方法,请说明,小弟不慎感激!


总结:

在Android中,程序的响应(Responsive)被活动管理器(ActivityManager)和窗口管理器(Window Manager)这两个系统服务所监视。当BroadcastReceiver在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive()执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver就先结束了。如果BroadcastReceiver结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

public class IncomingSMSReceiver extendsBroadcastReceiver {
  @Override public void onReceive(Contextcontext, Intentintent) {
            //发送Intent启动服务,由服务来完成比较耗时的操作
            Intent service =new Intent(context,XxxService.class);
            context.startService(service);
  }
}

每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法。

所以上面的短信内容上传到服务器上的逻辑功能不能在广播中执行,需要开启一个服务进行上传。



分享到:
评论

相关推荐

    《Android应用开发详解》源码_文档讲解

    第8章 Android广播事件处理 Broadcast Receiver 第9章 Android中的数据存取 第10章 Content Provider 第11章 Android中的多媒体应用 第12章 Android中的图形图像 第13章 Android中的互联网应用 第14章 Android中的...

    Android基础知识之broadcast广播详解

    Android中的广播用的太多了,今天稍微总结一下。 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一个activity上点击按钮,发送一...

    Android应用开发详解

    第8章 Android广播事件处理 Broadcast Receiver Android 广播事件处理 Broadcast Receiver,讲述了广播事件处理机制、Notification、NotificationManager和AlarmManager的使用 第9章 Android中的数据存取 Android...

    Android开发应用实战详解源代码

    2.8.2 使用broadcast receiver监听广播 2.8.3 android本地广播 2.9 小结 第3章 设备界面演练 3.1 文字标签处理 3.2 改变屏幕窗口元素的背景颜色 3.3 改变textview的文字颜色 3.4 实现textview文字的替换 3.5 获取...

    android应用开发详解 郭宏志编著 pdf格式

    第八章 android广播事件处理Broadcast Receiver 第九章 android中的数据存取 第十章 Content Provider 第十一章 android中的多媒体应用 第十二章 android中的图形图像 第十三章 android中的互联网应用 第十四章 ...

    Android开发应用中Broadcast Receiver组件详解

    BroadcastReceiver(广播接收器)是Android中的四大组件之一。下面就具体介绍一下Broadcast Receiver组件的用法。 下面是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,...

    详解Android 进程间通信的几种实现方式

    一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯的...Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可

    Android Intent和Intent Filter详解

    Intents and Intent Filters  三种应用程序基本组件——activity, ... 在上述三种情况下, android系统会自己找到合适的activity, service, 或者 broadcast receivers来响应intent. 三者的intent相互独立互不干扰.

    详解Android中BroadCastReceiver组件

    在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。 下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver...

    android之BroadcastReceiver应用详解

    主要介绍了android之BroadcastReceiver应用详解,BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。有兴趣的可以了解一下。

    ANDROID源码分析实录

    主要内容包括走进Android世界、硬件抽象层详解、分析JNI(Java本地接口)层、Android内存系统分析、Andmid虚拟机系统详解、IPC通信机制详解、Zygote进程/System进程和应用程序进程、分析Activitv组件、Content ...

    android开发入门与实战(下)

    9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务——Service应用实例 10.1 认识Service 10.2 使用...

    android开发入门与实战(上)

    9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务——Service应用实例 10.1 认识Service 10.2 使用...

    《Google Android开发入门与实战》.pdf

    9.2.1 实现android中的广播事件 180 9.2.2 broadcast receiver介绍 181 9.3 应用实例详解 181 9.3.1 程序操作演示 182 9.3.2 实例编程实现 182 9.4 本章小结 186 第10章 一切为用户服务——...

    《Android开发权威指南》 PDF (安卓sdk 2.3)

    基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android中的窗口...

    android开发入门教程

    9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务——Service应用实例 10.1 认识Service 10.2 使用...

Global site tag (gtag.js) - Google Analytics