A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2016-12-4 11:11 编辑

【济南中心】Android课程同步笔记day07:Android应用开发基础

广播接收者:BroadcastReceiver
1. 创建一个类继承BroadcastReceiver
[Java] 纯文本查看 复制代码
                class SDCardStatusReceiver extends BroadcastReceiver {

                }
2. 在清单文件中的Application节点下进行配置:
[Java] 纯文本查看 复制代码
<application
                android:allowBackup="true"
                android:icon="@drawable/ic_launcher"
                android:label="@string/app_name"
                android:theme="@style/AppTheme" >
                ...
                        ...
                <!-- 广播接收者的全类名 -->
                <receiver android:name="com.itheima.sdstatus.SDCardStatusReceiver" >
                    <!-- 配置要接收哪个广播 -->
                    <intent-filter>
                        <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
                        <data android:scheme="file"></data>
                    </intent-filter>
                </receiver>
            </application>
3. onreceive方法里面编写业务逻辑:
[Java] 纯文本查看 复制代码
                public class SDCardStatusReceiver extends BroadcastReceiver {
        
                        @Override
                        public void onReceive(Context context, Intent intent) {
                                Toast.makeText(context, "外部存储卡已被拔出,微信头像和朋友圈功能暂不可用", 0).show();
                        }
                }

开机启动的广播接收者的配置:
添加权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>;
在清单文件的application节点中进行配置:
[Java] 纯文本查看 复制代码
        <receiver android:name="com.itheima.bootcomplete.BootCompleteReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>
如何重写返回键的功能:
[Java] 纯文本查看 复制代码
        //重写Activity的onBackPressed()方法
        @Override
        public void onBackPressed() {
                
        }

外拨电话的广播接收者的配置:
添加权限:<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>;
在清单文件的application节点中进行配置:
[Java] 纯文本查看 复制代码
        <receiver android:name="com.itheima.ipdail.OutCallRecevier">
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>

获得外拨电话号,修改外拨电话号:
[Java] 纯文本查看 复制代码
        public class OutCallRecevier extends BroadcastReceiver {
        
                @Override
                public void onReceive(Context context, Intent intent) {
                        SharedPreferences sp = context.getSharedPreferences("config", 0);
                        String ipnumber = sp.getString("ipnumber", "");

                        //获取外拨电话号
                        String number = getResultData();
                        if (number.startsWith("0")) {

                                //设置外拨电话号
                                setResultData(ipnumber + number);
                        }
                }
        
        }

软件安装和卸载的广播接收者的配置:
在清单文件的application节点中进行配置:
[Java] 纯文本查看 复制代码
        <receiver android:name="com.itheima.datacollection.AppStatusReceiver" >
        <intent-filter >
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <action android:name="android.intent.action.PACKAGE_REMOVED"/>
            <data android:scheme="package"></data>
        </intent-filter>
    </receiver>

短信广播接收者的配置
添加权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>;
在清单文件的application节点中进行配置
[Java] 纯文本查看 复制代码
        <receiver android:name="com.itheima.smslistener.SmsReceiver">
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>

短信数据的解析
[Java] 纯文本查看 复制代码
        public class SmsReceiver extends BroadcastReceiver {

                @Override
                public void onReceive(Context context, Intent intent) {
                        System.out.println("短信到来了....");
                        //短信的数据是pdu的数据,必须对短信的格式很了解才可以解析短信.
                        Object[] objs = (Object[]) intent.getExtras().get("pdus");
                        for(Object obj:objs){
                                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
                                String body = smsMessage.getMessageBody();
                                String sender = smsMessage.getOriginatingAddress();
                                System.out.println("body:"+body);
                                System.out.println("sender:"+sender);
                                abortBroadcast();
                        }
                }
        }

广播接收者不同版本中的特性
1. 自Android 3.1之后,所有新安装但未被执行过的apk,以及那些被用户强行停止的apk,都会处于stopped状态。这个状态下,apk中的广播接收者,均处于未激活状态, 无法履行监听功能。
2. 在广播发发送方发送广播时需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES
[Java] 纯文本查看 复制代码
                Intent intent = new Intent();
                intent.setAction("com.itheima.broadcast");
                if (android.os.Build.VERSION.SDK_INT >= 12) {
                     intent.setFlags(32);//3.1以后的版本需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES
                }
                sendBroadcast(intent);

如何发送和接收自定义广播
1.发送:
[Java] 纯文本查看 复制代码
                Intent intent = new Intent();
                //自定义action
                intent.setAction("com.itheima.ccav.XWLB");
                //可以添加参数
                intent.putExtra("key", "dfafadfa");
                sendBroadcast(intent);
2.接收:
[Java] 纯文本查看 复制代码
                <receiver android:name="com.itheima.myreceiver.MyReceiver">
            <intent-filter >
                                //填写要接收自定义广播的action
                <action android:name="com.itheima.ccav.XWLB"/>
            </intent-filter>
        </receiver>

序广播和无序广播的区别
1. 有序广播
    * 广播消息是按照一定的顺序传达的,高优先级的先得到广播消息,低优先级的后得到
    * 高优先级的可以拦截广播消息或者修改广播消息
    * 效率比较低
2. 无序广播
    * 广播消息没有顺序,同时接受广播消息
    * 不可以修改广播消息
    * 效率高

如何发送有序广播
[Java] 纯文本查看 复制代码
        Intent intent = new Intent();
        intent.setAction("com.itheima.gov.SENDMASHROOM");
        // 发送有序广播
        // intent 意图
        // receiverPermission 权限 默认null
        // resultReceiver 结果接受者 null
        // scheduler 消息处理器 null 默认
        // initialCode 初始化码
        // initialData 初始化数据
        // initialExtras null 额外的数据
        sendOrderedBroadcast(intent, null, null, null, 1, "主席讲话: 每人10斤蘑菇", null);

有序广播的特点
1. 优先级在哪里配置,范围是多少
[Java] 纯文本查看 复制代码
                <receiver android:name="com.itheima.smslistener.SmsReceiver">
                        //在此处配置,范围从1000到-1000
                <intent-filter android:priority="1000">
                    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                </intent-filter>
            </receiver>
2. 如何获取数据,如何修改数据
[Java] 纯文本查看 复制代码
                //获取数据
                String data = getResultData();

                //修改数据
                setResultData("主席讲话:每人5斤蘑菇");
3. 如何终止有序广播  abortBroadcast();
4. resultReceiver什么时候收到广播,需要在清单文件中配置吗
        1.在所有广播接收者都收到消息后接受到广播
        2.即使有广播接收者终止了广播,resultReceiver也可以接收到广播
        3.不需要在清单文件中配置
如何动态注册广播接收者
    receiver = new ScreenStatusReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.SCREEN_OFF");
    filter.addAction("android.intent.action.SCREEN_ON");
    registerReceiver(receiver, filter);
动态注册广播接收者的特点
1. 在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效。电量变化、屏幕锁屏、解锁,这些广播事件只能利用代码注册
2. 动态注册的广播接收者可以将其关闭掉

        unregisterReceiver(receiver);

服务:长期后台运行,没有界面的组件,服务是运行在当前应用程序进程里面
如何创建一个服务
1. 创建一个类继承Service
        public class DemoService extends Service {
        }
2. 在清单文件的application节点中进行配置
        <service android:name="com.itheima.servicedemo.DemoService" >
        </service>
如何开启和关闭服务
1. 开启服务
        Intent intent = new Intent(this,DemoService.class);
        startService(intent);
2. 关闭服务
        Intent intent = new Intent(this,DemoService.class);
        stopService(intent);
进程的优先级
1. Foreground process   
前台进程:用户正在操作的应用程序所在的进程就是前台进程
2. Visible process  
可视进程:用户已经不能操作这个应用程序了,但是界面用户仍然可以看到
3. Service process  
服务进程:应用程序有一个服务代码正在运行
4. Background process  
后台进程:应用程序有界面,但是界面被用户最小化(点击home键),或者开启了另一个界面,当前界面不可见了
5. Empty process  
空进程:应用程序没有任何运行的Activity、Service
前台进程 > 可视进程 > 服务进程 > 后台进程 > 空进程
为什么需要服务
1. 当应用程序退出后,如果里面只有一个子线程,那么这个进程就会被当作一个空进程,优先级很低。当内存不足的时候,会被很快的被回收了      
2. 而如果开了一个服务的话,就算把程序退出了,那么这个进程也是一个服务进程,优先级中等,轻易不会被回收!即使被回收了,在内存充足的时候也会被重新开启
服务的生命周期
1. 多次调用startService()的方式开启服务,服务只会被创建一次,在创建的时候执行onCreate()方法,一旦服务创建完毕,再去开启service就不会重复执行onCreate()方法了,只会执行onStart()和onStartCommand()
2. 调用stopService()停止服务,执行ondestroy()方法,服务只会被停止一次







5 个回复

正序浏览
多谢分享
回复 使用道具 举报
谢谢分享啊
回复 使用道具 举报

回帖奖励 +1

支持一个
回复 使用道具 举报

回帖奖励 +1

不错,不错,谢谢分享
回复 使用道具 举报

回帖奖励 +1

同学们快来学习吧!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马