Android中的广播机制

一.Activity的四种启动模式
  1. 标准模式:standard:默认的启动模式,每次激活都会创建Activity实例
  2. 栈顶模式 , SingleTop: 假如要激活的Activity的实例刚好处于栈顶,则不需要创建实例
  3. 单任务模式, SingleTask :假如要激活的Activity在本任务栈有该实例,则不需要创建,处于该实例上面的Activity 对象要弹出栈, 单任务的Activity实例处于栈顶,实现与用户交互
  4. 单实例模式, SingleInstance : 单独开辟一个任务栈,来处理单实例的Activity 

使用场景:
  
  
  1. 假如是临时的Activity,则采用标准模式,当Activity使用完,则关闭
  2. 对于项目中的导航界面或者主界面,因为要经常展示,所以设置单任务模式
  3. 对于栈顶模式的使用,假如经常自己刷新自己界面,则可以采用栈顶模式
  4. 对于单实例模式:一般该Activity会经常共享(比如浏览器Activity),或者Activity 创建起来耗时

二.Android广播机制
Activity 活动     services 服务 contentprovider内容提供者      broadcastreceiver广播接收器
1.广播机制的特点
广播的发送者不需要关心是否有人接受,广播的发送是系统级别的事件,广播的接收是应用级别的事件
系统默认开启了很多服务,通过服务的检测,最后以广播的形式发送事件,接受者需要订阅广播才能接收广播
广播的存在是为了解决应用之间的通信
2.广播的使用
1.首先,需要创建类,继承BroadcastReceiver,并重写onReceiver()方法
  
  
public class Ipnumber extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "哈哈", Toast.LENGTH_SHORT).show();
SharedPreferences sp = context.getSharedPreferences("info", context.MODE_PRIVATE);
int ip = sp.getInt("ip", 0);
String number = getResultData();
 
if (number.startsWith("0")){
setResultData(ip+number);
Log.e("result",ip+number);
}
 
}
}
2.需要在清单文件中注册广播接收器组件(需要写在application内Activity外)
   
   
<!--注册IP号码接收器,订阅对外拨号的广播时间-->
<receiver android:name=".Ipnumber">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
3.对于需要权限的广播,需要在清单文件中添加权限
   
   
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
4.当系统发出应用所订阅的广播时,应用会做出相应的处理,而此时,应用不需要处于运行界面.

三.使用广播接受者实现应用程序的卸载与安装监听


   
   
package com.example.it;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
 
/**
* Created by Administrator on 2017/4/27.
*/
 
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
 
//获取事件类型
String result = intent.getAction();
if (intent.ACTION_PACKAGE_REMOVED.equals(result)){
Toast.makeText(context, "应用被卸载了", Toast.LENGTH_SHORT).show();
 
}else if (intent.ACTION_PACKAGE_ADDED.equals(result)){
Toast.makeText(context, "应用安装了", Toast.LENGTH_SHORT).show();
}
}
}

   
   
<!--注册监听应用的卸载与安装-->
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<data android:scheme="package" />
</intent-filter>
</receiver>

四.自定义发送与接收广播

1.创建一个按钮发送广播
  
  
public void click(View view) {
//定义一个意图
Intent intent = new Intent();
//设置广播的事件名称
intent.setAction("com.itheima.haha");
//设置传递的数据
intent.putExtra("name","我是自定义广播");
//发送一条无序广播
sendBroadcast(intent);
 
}

2.在列表清单文件中注册
   
   
<receiver android:name=".Myrecever">
<intent-filter>
<action android:name="com.itheima.haha"/>
</intent-filter>
</receiver>
3.定义一个类来接收广播
   
   
//定义一个类用来接收广播
public class Myrecever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
 
String name = intent.getStringExtra("name");
 
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
}

五.有序广播与无序广播
  1.  有序广播 按广播接收者接收的优先级顺序发送广播,有序广播可以被拦截,终止,广播的信息可以被修改,是一种同步方式的广播 sendOrderBroadcast() //发有序广播
  2. 无序广播 发送广播是无序的,广播不能拦截,广播的数据不能修改,没有先后接收顺序,是一种异步方式的广播 sendBroadcast() //发无序广播
  3. 优先级配置 在注册广播接收者时配置: <intent-filter android:priority="1000"> ,范围 (1000) - (-1000) 
有序广播案例
1.发送广播
   
   
public void click(View view) {
//设置意图,封装事件
Intent intent = new Intent();
//设置事件
intent.setAction("com.itheima.go");
//附加数据
intent.putExtra("go", "五一放假了");
//发送广播
sendOrderedBroadcast(intent,null,null,null,0,"注意安全",null);
}
2.第一个接收者
   
   
public class Itcast1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
 
String action = intent.getStringExtra("go");
 
Log.e("result",""+action);
String resultData = getResultData();
setResultData(resultData+"总监强调");
Log.e("result","Itcast1"+resultData);
 
 
}
}
3.第二个接收者
   
   
public class Itcast2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
 
String action = intent.getStringExtra("go");
Log.e("result",""+action);
String resultData = getResultData();
setResultData(resultData+"老师强调");
Log.e("result","Itcast2"+resultData);
}
}
4.第三个接收者
   
   
public class Itcast3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
 
String action = intent.getStringExtra("go");
Log.e("result",""+action);
String resultData = getResultData();
Log.e("result","Itcast3"+resultData);
}
}
5.注意在清单文件中注册
   
   
//注册广播接受者
<receiver android:name=".Itcast1">
<intent-filter>
<action android:name="com.itheima.go"/>
</intent-filter>
</receiver>
 
<receiver android:name=".Itcast2">
<intent-filter>
<action android:name="com.itheima.go"/>
</intent-filter>
</receiver>
 
<receiver android:name=".Itcast3">
<intent-filter>
<action android:name="com.itheima.go"/>
</intent-filter>
</receiver>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值