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();