您的位置:首页 > 移动开发 > Android开发

4.1.3.1 Android Broadcast-Receiver的心得

2016-02-28 11:01 375 查看
Action:

android.net.conn.CONNECTIVITY_CHANGE/ConnectivityManager.CONNECTIVITY_ACTION
权限android.permission.ACCESS_NETWORK_STATE,android.permission.CHANGE_NETWORK_STATE

android.intent.action.BATTERY_CHANGED/Intent.ACTION_BATTERY_CHANGED
权限:android.permission.BATTERY_STATS

短信:android.provider.Telephony.SMS_RECEIVED 权限:android.permission.RECEIVE_SMS

!!!注意,电池电量只能够使用动态注册,如果使用静态的就会把系统弄的太慢了。

1: 接收网络变化

2:接收电池变化

3:接收短信

4: 无序广播的发送

5:有序广播的发送

6:广播的终止

网络电话笨:如果手机当前切换wifi 电话本自动和服务器同步,静态注册;

++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………

广播的说明,

广播接收者在系统中注册,

静态注册-》action-》class

动态注册-》action-》实例对象

电视的开机,静态注册

电视机开机后 选台, 动态注册,

++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………

* onReceiver方法,通常运行在主线程,

* Android 系统给这个方法一个超时时间10s,如果方法运行的时间超过10s

* Android系统将会销毁这个广播接收者;!!!

* 当静态注册的时候:广播接受者在执行完onRecevier 之后,立刻销毁,代表生命周期

* 动态注册:设么时候取消注册,并置空,之后销毁。

++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………

Homework:

注意 <android.support.v4.view.ViewPager

<android.support.design.widget.TabLayout

viewPager.setOffscreenPageLimit(3);

可以用来设置显示的个数,有的时候,3个fragment,但是默认的是1,所以会出现打开的时候,第三个是不onResume的,到了第三个了,这个时候第一个又不onResume。

所以可以设置为3,让他们一直onResume。

TabLayout
http://developer.android.com/reference/android/support/design/widget/TabLayout.html
在build.gradle 的dependencies 里面添加

compile 'com.android.support:design:23.1.0'

文件的位置是

C:\Android\sdk\extras\android\m2repository\com\android\support\design\23.1.0

调用的path:

android.support.design.widget.TabLayout

TabLayout tabLayout = ...;

tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));

tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));

1:广播接收者,四大组件之一,

常见的广播:

检查到WiFi的时候,系统通知发现WwiFi是否加入

当收到短信的时候,系统发送短信收到的信息,

当手机收到电话的时候,系统发送广播,告诉应用,来电话,

当手机重新开机之后,系统会发送广播,告诉所有的应用,手机启动了。

短信的拦截。

用来接受Android 系统 或者是 应用程序 发送过来的各种广播信息。

系统、应用程序发生状态改变的时候,需要向系统统中通知其他的应用程序,进行一些操作,这个信息就是广播

2:广播接受者与哪些组件配合,

最常用的是Notifiction配合的很多很多 Notification 偏向于展示

然后就是和service 配合很多很多。 Service 偏向于无UI处理业务逻辑。

谁谁谁来信了,一个大喇叭,所有人都知道你来信了。

3:

静态注册广播接收者。

可以理解为静态变量,可以直接使用。 可以直接使用,用完生命周期就结束了,需要用的时候再直接使用。

动态注册广播接收者,可以理解为实例变量,需要对象才能调用。

静态注册广播接收者

<!--组册广播接收者:告诉系统这个接收者,关注,检测哪一种广播消息,-->

<receiver android:name=".receivers.NetworkReceiver"

>

<!--使用intent filter 来告诉Android系统,这个接收者需要接受哪种广播消息-->

<intent-filter>

<!--设置接受者接收的消息类型action,代表intent中getAction()返回的内容-->

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

</intent-filter>

</receiver>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

public class NetworkReceiver extends BroadcastReceiver{

/**

* 广播接收者当收到广播信息(Intent数据)的时候,进行回调,大部分情况,这个方法是运行在主线程的。

* 可以通过手动设置的形式让这个方法在子线程执行,

* @param context

* @param intent

*/

@Override

public void onReceive(Context context, Intent intent) {

//广播中的重要数据:

//1.ACTION-》getAction()返回当前广播的类型。!!!需要背下来,

Log.d("NetworkReceiver", "收到广播消息" +intent );

String action = intent.getAction();

//2.判断广播消息的类型,使用网络变化状态为例,

if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

ConnectivityManager connectivitManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

//如果是WIFI 就是Context.WIFI_SERVICEI

//如果是短信Context.TELEPHONY_SERVICE

NetworkInfo activeNetworkInfo = connectivitManager.getActiveNetworkInfo();

String netWorkState="无网络";

if (activeNetworkInfo != null) {

//获取枚举类型的 网络状态

NetworkInfo.State state = activeNetworkInfo.getState();

Log.d("NetworkRecevier", "当前状态 " + state);

activeNetworkInfo.getReason();

activeNetworkInfo.getSubtype();//当前是3G,还是WiFI

String typeName = activeNetworkInfo.getTypeName();

int type = activeNetworkInfo.getType();

switch (type){

case ConnectivityManager.TYPE_MOBILE:

if(state==NetworkInfo.State.CONNECTED){

netWorkState="切换到手机网络";

}

break;

case ConnectivityManager.TYPE_WIFI:

if(state==NetworkInfo.State.CONNECTED){

netWorkState="切换到wifi网络";

}

break;

default:

if(state==NetworkInfo.State.CONNECTED){

netWorkState="切换到其他网络";

}

break;

}

Log.d("NetworkRecevier", "TypeName"+typeName );

int subtype = activeNetworkInfo.getSubtype();

switch (subtype){

case ConnectivityManager.TYPE_MOBILE_DUN:

break;

}

String subTypeName = activeNetworkInfo.getSubtypeName();

Log.d("NetworkRecevier", "subTypeName"+subTypeName );

}else{

Log.d("NetworkRecevier", "已经断线");

}

sendNotification(context,"网络变化 ",netWorkState);

}

}

/**

* 发送通知消息

* @param context

* @param content

*/

public static void sendNotification(Context context,String title,String content){

//1.

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title).setContentText(content);

Notification n = builder.build();

NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);

managerCompat.notify(188,n);

}

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

电池充电的广播接收,只能通过动态注册,不能通过静态注册:

public class MainActivity extends AppCompatActivity {

private BatteryReceiver batteryReceiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

batteryReceiver = new BatteryReceiver();

}

@Override

protected void onResume() {

super.onResume();

//1.创建IntentFilter,对应<intent-filter><action/>

//直接指定

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

//2.动态注册Context对象registerReceiver

//!!!哪个Context注册,那么,这个Receiver作用范围

registerReceiver(batteryReceiver, intentFilter);

}

@Override

protected void onPause() {

super.onPause();

//onPause 里面一定要取消注册:不然在退出的时候会报错:

unregisterReceiver(batteryReceiver);

}

@Override

protected void onDestroy() {

super.onDestroy();

batteryReceiver=null;

}

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

package com.kodulf.broadcastrecevierdemo.receivers;

/**

* Created by Administrator on 15-12-15.

*/

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.BatteryManager;

import android.util.Log;

/**

* 动态注册的案例,

* 使用电池电量检测;

* !!!注意,电池电量只能够使用动态注册,如果使用静态的就会把系统弄的太慢了。

*/

public class BatteryRecevier extends BroadcastReceiver {

private String TAG="BatteryRecevier";

@Override

public void onReceive(Context context, Intent intent) {

//1,定义action 内容,也就是电池变化的ACTION

String action = intent.getAction();

//电池电量变化,是Android 基本的状态,所以定义在Intent 中

//包含一个ACTION

if(action.equals(Intent.ACTION_BATTERY_CHANGED)){

//2.获取电量相关信息

//标准的广播信息,都存储在Intent 参数中,

//通过BatteryManager来获取;内部包含了常量定义

int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);

int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);

int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);

int state = intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);

int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);

Log.d("TAG","level "+level);

Log.d("TAG","scale "+scale);

Log.d("TAG","health "+health);

Log.d("TAG","state "+state);

Log.d("TAG","plugged "+plugged);

//检测是否街上电源了

switch(plugged){

case BatteryManager.BATTERY_PLUGGED_AC:

//接上电源插座,交流电

break;

case BatteryManager.BATTERY_PLUGGED_USB:

//接上电脑USB充电

break;

case BatteryManager.BATTERY_PLUGGED_WIRELESS:

//无线充电

break;

}

//----------------------------------

//检测status

switch(state){

case BatteryManager.BATTERY_STATUS_CHARGING:

//充电中

break;

case BatteryManager.BATTERY_STATUS_DISCHARGING:

//耗电

break;

case BatteryManager.BATTERY_STATUS_FULL:

//充满电

break;

}

}

}

}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接收短信:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: