Android学习笔记【07】【四大组件之广播接收者】

一、为什么需要广播接收(BroadcastReceiver)

话题外:互联网营销模式

投资,向用户免费开发,积攒用户,然后出收费功能

二、广播接收者案例:IP拨号器

1、定义一个类继承BroadcastReceiver

2、清单文件里配置广播接收者(需要接收的内容action)

3、重写onReceive方法

4、如果需要权限,添加对应的权限

三、广播接收者案例:SD卡状态监听

String action = intent.getAction()获取广播的事件(配置接收时的action)

MEDIA_MOUNT和UNMOUNT需要配置data的scheme="file"

四、广播接收者案例:短信监听器

短信接收的广播可以配,没有自动提示

1 <receiver android:name="com.xx.xx.xxReceiver">
2     <intent-filter>
3         <action android:name="android.provider.Telephony.SMS_RECEIVED" />
4     </intent-filter>
5 </receiver>
Object[] objects = (Object[]) intent.getExtras().get("pdus");//获取多条短信

for(Object obj:objects){
SmsManage smsManage = SmsManage.createFromPdu((byte[]) obj);
String msgBody
= smsManage.getMessageBody(); String address = smsManage.getOriginatingAddress(); }

五、不同版本广播的特点

1、4.0后,第一次安装应用的时候必须有界面,这样广播接收者才生效

2、设置界面点击强行停止按钮,广播接收者也不会生效

3、2.3手机上没有这样的安全设计

六、广播接收者案例:卸载安装

对应action:PACKAGE_INSTALL(没有使用)、PACKAGE_ADDED、PACKAGE_REMOVED

配置data的scheme:package

七、广播接收者案例:开机启动

对应action:BOOT_COMPLETED

需要权限:RECEIVE_BOOT_COMPLETED

广播接收者中不能直接启动Activity

如果要启动,对应intent需要设置FLAG:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

八、有序广播和无序广播

1、有序广播

//Parameters
//intent    The Intent to broadcast; all receivers matching this Intent will receive the broadcast.
//receiverPermission    String naming a permissions that a receiver must hold in order to receive your broadcast. If null, no permission is required.
//resultReceiver    Your own BroadcastReceiver to treat as the final receiver of the broadcast.
//scheduler    A custom Handler with which to schedule the resultReceiver callback; if null it will be scheduled in the Context's main thread.
//initialCode    An initial value for the result code. Often Activity.RESULT_OK.
//initialData    An initial value for the result data. Often null.
//initialExtras    An initial value for the result extras. Often null.
public void sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, 
Handler scheduler, int initialCode, String initialData, Bundle initialExtras);

initialData获取:getResultData()

接收者配置优先级(数字越大优先级越高):

<intent-filter android:priority="1000">
    <action android:name="xxxx" />
</intent-filter>

优先级大的收到广播后可以操作:

修改数据:setResultData();

终止广播:abortBroadcast();

2、无序广播

intent.setAction("com.xxx.xxx");//用于接收广播者配置action
intent.putExtra(key,value);
sendBroadcast(intent);

九、特殊广播接收者

特别频繁的广播事件,在广播清单文件里注册无效,需要动态注册(事件:屏幕锁屏和解锁、电池电量变化)(普通广播也可以通过动态注册接收)

ScreenReceiver receiver = new ScreenReceiver();
IntentFilter filter = new IntentFilter();

filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");

//动态注册广播接收者(需要在onDestroy中取消注册)
registerReceiver(receiver,filter);

//取消注册
unregisterReceiver(receiver);

十、样式和主题

1、样式:一般作用在控件上,作用范围小,styles(可以是其他jxml文件中定义,在values文件下即可)中自定义样式:

<style name="my_style">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">40sp</item>
    <item name="android:textColor">#00ff00</item>
</style>

布局中引用使用:

<TextView
    style="@style/my_style"
    android:text="使用自定义的样式"/>

2、主题:一般作用在activity或者Application节点下,作用范围大,定义方法与样式相同

十一、国际化(i18n)

中文目录:values-zh

英文目录:values-en

浏览器->nternet选项->语言->添加,可以查看对应名称(WIN7)

十二、常见对话框

对话框中上下文参数只能用this

Toast

普通对话框

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("标题");
builder.setMessage("今天开心嘛");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
});
builder.show();

单选对话框:

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请选择课程");
final String[] items = new String[]{"Android","C#","Python","html"};
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        //items[which] choosed
        dialog.dismiss();
    }
});
builder.show();

多选对话框:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请选择爱好");
final String[] items = new String[]{"游戏", "电影", "运动"};
final boolean[] itemschecked = new boolean[]{false, true, false};

builder.setMultiChoiceItems(items, itemschecked, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        for (int i = 0; i < items.length; i++) {
            if (itemschecked[i]) {
                //items[i] is checked
            }
        }

        dialog.dismiss();
    }
});
builder.show();

进度条对话框(进度相关的控件,可以在子线程更新UI)

ProgressDialog dialog =new ProgressDialog(this);
dialog.setTitle("正在玩命加载中");
//转圈
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//水平,可以设置进度
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

dialog.show();

十三、动画

帧动画、属性动画、View动画(补间动画)

帧动画:加载一系列的图片资源播放,形成的动画效果(一帧一帧的播放)

final ImageView rocketImage = (ImageView) findViewById(R.id.iv);
rocketImage.setBackgroundResource(R.drawable.my_anim);

//低版本需要时间加载资源,写在线程中
new Thread(){public void run(){
    SystemClock.sleep(20);
    AnimationDrawable rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
    rocketAnimation.start();
};
}.start();
原文地址:https://www.cnblogs.com/leishoulin/p/7441355.html