android基础之四——广播与服务(一)
来源:互联网 发布:天圆地方软件 编辑:程序博客网 时间:2024/06/06 19:20
01_为什么需要广播接受者
1、电台:中央人民广播电台 93.4mhz;2、收音机:买一个收音机,插上电池,调整到一个频道,接收广播;Android系统中内置了广播电台(系统自带的广播功能),会广播出来一些事件(电量不足、电量充满、接收到短信、外拨电话、拨进来电话、SD状态、开机启动等),指定了接收者广播消息的客户端软件(自己开发的应用程序)可以做一些对用户有用的事情。
02广播接受者案例ip拨号器(重点)
在拨打电话的时候,把IP电话自动的添加到目标电话号码的前面,让拨打IP电话:1、监听到用户外拨电话的事件:2、得到用户外拨的电话号码,然后把ip电话添加目标电话号码的前面:3、让用户拨打已经修改后电话号码:写广播接收者的步骤:1、买一个收音机: public class OutCallBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }2、插上电池: <receiver android:name="com.itheima.ipcall.OutCallBroadcastReceiver"> </receiver>3、调整到一个频道: <receiver android:name="com.itheima.ipcall.OutCallBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
代码:
package com.itheima.ipcall;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;//1、监听到用户外拨电话的事件: public class OutCallBroadcastReceiver extends BroadcastReceiver { /** * 接收到广播消息后调用这个方法 */ @Override public void onReceive(Context context, Intent intent) { //2、得到用户外拨的电话号码, String phone = getResultData(); SharedPreferences sp = context.getSharedPreferences("info", Context.MODE_PRIVATE); String ipPhone = sp.getString("ipPhone", ""); //然后把ip电话添加目标电话号码的前面: phone = ipPhone + phone;// 3、让用户拨打已经修改后电话号码: setResultData(phone); } }
配置文件:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <receiver android:name="com.itheima.ipcall.OutCallBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
03广播接受者案例短信监听器(重点)
pdus:protocol data unit s 协议数据单元;广播接收者的特点:1、即使广播接收者没有运行,当广播消息到达的时候系统会自动的启懂广播接收者,调用onReceive方法处理消息;2、在android4.0版本之后的系统,强制要求带广播接收者的应用程序必须有界面,并且至少运行过一次。3、在android4.0版本之后的系统,强制要求带广播接收者的应用程序被冻结后,就不能运行了,只能在手工启动的时候才有效。
代码: package com.itheima.smslistener;
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.SmsMessage;public class SMSBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //得到短信数据 Object[] objs = (Object[]) intent.getExtras().get("pdus"); for(Object obj :objs){ //obj是一条短信的byte数组 SmsMessage sms = SmsMessage.createFromPdu((byte[])obj); //得到短信内容 String content = sms.getMessageBody(); //得到发送短信的电话号码 String phone = sms.getOriginatingAddress(); System.out.println("content==="+content); System.out.println("phone==="+phone); } }}
配置文件:
<uses-permission android:name="android.permission.RECEIVE_SMS"/> <receiver android:name="com.itheima.smslistener.SMSBroadcastReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
04广播接受者案例sd卡状态监听(重点)
测试的时使用4.0之前的模拟器或者真机,因为4.0之后的版本上已经去调用SD插拔、移除的功能;
代码:
package com.itheima.sdlistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class SDBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_MOUNTED")){ Toast.makeText(context, "SD卡已经插上", 0).show(); } if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){ Toast.makeText(context, "SD卡已经被拔掉", 0).show(); } if(action.equals("android.intent.action.MEDIA_REMOVED")){ Toast.makeText(context, "SD卡已经被移除", 0).show(); } }}
配置文件:
<receiver android:name="com.itheima.sdlistener.SDBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.MEDIA_MOUNTED"/> <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <action android:name="android.intent.action.MEDIA_REMOVED"/> <!-- 必须加上这个数据 --> <data android:scheme="file" /> </intent-filter> </receiver>
05广播接受者案例开机启动(重点)
1、让界面没法关闭,没法最小化;2、如果支付成功,关闭当前界面;
代码:
MainActivity.java:
package com.itheima.bootlistener;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void pay(View view) { Toast.makeText(this, "已经支付了100元", 0).show(); // 支付完成后关闭当前界面 finish(); } @Override public void onBackPressed() { // 按返回键不执行任何操作 }}
BootCompletedBroadcastReceiver.java:
package com.itheima.bootlistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.sax.StartElementListener;public class BootCompletedBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context,MainActivity.class); //告诉Activity使用自己的任务栈来维护界面 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); }}
配置文件:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <receiver android:name="com.itheima.bootlistener.BootCompletedBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
06广播接受者案例卸载安装(重点)
代码:
package com.itheima.azxzlistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class AZXZBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if("android.intent.action.PACKAGE_INSTALL".equals(action)){ Toast.makeText(context, "有一个新软件安装了......", 0).show(); } if("android.intent.action.PACKAGE_REPLACED".equals(action)){ Toast.makeText(context, "有一个软件升级了......", 0).show(); } if("android.intent.action.PACKAGE_REMOVED".equals(action)){ Toast.makeText(context, "有一个软件被卸载了......", 0).show(); } }}
配置文件:
<receiver android:name="com.itheima.azxzlistener.AZXZBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.PACKAGE_INSTALL"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <!-- 必须添加这个属性 --> <data android:scheme="package"/> </intent-filter> </receiver>
07_发送自定义广播
自定义广播的代码: Intent intent = new Intent(); //设置广播的事件类型 intent.setAction("com.itheima.broadcast.FSZDYGB"); //设置广播传递的数据 intent.putExtra("info", "自定义的广播消息"); //发送广播消息 sendBroadcast(intent);
08_有序广播和无序广播(重点)
有序广播:当广播消息发送出去之后,可以根据广播接收者的优先级的高低,从高到低一级一级的传递消息;无序广播:当广播消息发送出去之后,只要是指定了广播事件类型的广播接收者都可以接受到这个消息;
发送有序的广播:
自定义的有序广播:
package com.itheima.broadcast;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View;
public class MainActivity extends Activity {
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}public void send(View view ){ Intent intent = new Intent(); // 设置广播的事件类型 intent.setAction("com.itheima.broadcast.GWYFFNTBT"); // 发送有序广播消息 // 发送广播的意图对象 // receiverPermission 指定广播接收者的权限,只有指定了这个权限的广播接收者才能接收到这个广播消息 //resultReceiver 指定哪个广播接收者最后接收到广播消息 //scheduler 消息处理器 //initCode初始码 //initData 初始数据 //extraData 传递的额外参数 sendOrderedBroadcast(intent, null, new ResultBroadcastReceiver(), null, 1, "发送2014年农田补贴,每亩地补贴900元", null);}
}
自定义的广播:
代码:
package com.itheima.gov;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class TownBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //得到广播的初始数据 String data = getResultData(); System.out.println("我是乡级人民政府,接收到国务院发送的消息:"+data); data = "发送2014年农田补贴,每亩地补贴168元"; //修改广播传递的数据 setResultData(data); }}
配置文件:
<receiver android:name="com.itheima.gov.ProvinceBroadcastReceiver"> <intent-filter android:priority="1000"> <action android:name="com.itheima.broadcast.GWYFFNTBT"/> </intent-filter> </receiver>
09_服务和进程优先级
windows下的服务:没有界面,可以长期运行在后台的应用程序;Android下的服务:没有界面,可以长期运行在后台的应用程序(没有界面的activity);进程:是运行应用程序的载体。当应用程序一启动的时候,系统自动创建一个进程,负责运行dalvik虚拟机,我们开发的应用程序试运行在dalvik虚拟机上的。Activity、BroadcastReceiver、Service、ContentProvider;应用程序:四大组件放在一起就是一个应用程序;
解决方案:给创建的每个进程定义一个类型和优先级;
进程的生命周期: 1、当应用程序已启动的时候,进程被创建; 2、当手工结束进程,或者强制停止应用程序可以结束进程、系统内存空间不够使用,系统会自动杀死低优先级的进程;
进程的等级:
Foreground process(前台进程)
应用程序界面可见,用户正在操作,activity的onresume方法被执行了,可以相应点击事件。
Visible process (可视进程)
应用程序的ui界面,用户还可以看到,但是不能操作了。
Service process (服务进程)
应用程序没有界面,但是有一个后台的服务还处于运行状态
Background process(后台进程)
应用程序没有服务处于运行状态,应用程序被最小化了,activity执行了onstop方法
Empty process (空进程)
没有任何组件运行,所有的activity都关闭了,任务栈清空了。
10_服务的特点
特点:1、服务第一次被开启的时候,系统创建一个服务对象,调用onCreate、onStartCommand;2、服务职能被创建一次,可以被开启多次,多次开启只会调用onStartCommand;3、停止服务调用onDestroy方法,服务只能被停止一次;4、服务没有界面,可以长期运行在后台;服务的应用场景: 当需要在后台运行一段程序,程序需要与服务器端通讯;
11_电话窃听器的模板代码(重点)
在后台运行一段程序,监听电话的状态,当电话铃声响起的时候,创建一个录音机;当电话接通的时候,使用录音机开始录音;当电话挂断的时候,录音机停止录音,上传录制的音频文件;实现步骤:1、写一个服务运行在后台;2、在服务里写一个电话的监听器;3、当电话铃声响起的时候,准备一个录音机;4、当电话接通的时候,使用录音机开始录音;5、当电话挂断的时候,录音机停止录音,上传录制的音频文件;
代码:
package com.itheima.phonelistener;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;/** * 1、写一个服务运行在后台; */public class PhoneStateListenerService extends Service {@Overridepublic IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null;}@Overridepublic void onCreate() { super.onCreate(); //2、在服务里写一个电话的监听器; //得到系统提供的电话服务 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); //监听电话的呼叫状态 tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);}private class MyListener extends PhoneStateListener{ /** * 当电话状态发生变化时调用这个方法 * state 电话状态:闲置、铃声响起、接通电话 * incomingNumber 呼入的电话号码 */ @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE://闲置 //5、当电话挂断的时候,录音机停止录音,上传录制的音频文件; break; case TelephonyManager.CALL_STATE_RINGING://铃声响起 //3、当电话铃声响起的时候,准备一个录音机; break; case TelephonyManager.CALL_STATE_OFFHOOK://接通电话 //4、当电话接通的时候,使用录音机开始录音; break; default: break; } }}
}
12_利用服务实现电话窃听器
代码:package com.itheima.phonelistener;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;/** * 1、写一个服务运行在后台; */public class PhoneStateListenerService extends Service {private MediaRecorder r;@Overridepublic IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null;}@Overridepublic void onCreate() { super.onCreate(); //2、在服务里写一个电话的监听器; //得到系统提供的电话服务 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); //监听电话的呼叫状态 tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);}private class MyListener extends PhoneStateListener{ /** * 当电话状态发生变化时调用这个方法 * state 电话状态:闲置、铃声响起、接通电话 * incomingNumber 呼入的电话号码 */ @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE://闲置 System.out.println("==========CALL_STATE_IDLE========="); //5、当电话挂断的时候,录音机停止录音,上传录制的音频文件; if(r != null){ r.stop(); r.release(); r = null; } break; case TelephonyManager.CALL_STATE_RINGING://铃声响起 try { System.out.println("==========CALL_STATE_RINGING========="); r = new MediaRecorder(); r.setAudioSource(MediaRecorder.AudioSource.MIC); r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); r.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp"); r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //准备录音机 r.prepare(); } catch (Exception e) { e.printStackTrace(); } break; case TelephonyManager.CALL_STATE_OFFHOOK://接通电话 //4、当电话接通的时候,使用录音机开始录音; System.out.println("==========CALL_STATE_OFFHOOK========="); r.start(); break; } }}}
配置文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><service android:name="com.itheima.phonelistener.PhoneStateListenerService"></service>
0 0
- android基础之四——广播与服务(一)
- android基础之四——广播与服务(二)
- Android之广播与服务<一>
- Android应用开发基础之广播与服务
- 广播与服务一
- Android 广播与服务
- Android 广播与服务
- Android广播与服务
- Android学习——服务Service与广播接收者BroadcastReciver
- 广播与服务总结一
- Android基础之广播
- Android广播基础_广播一
- android基础——广播
- Androidの广播与服务
- Android 服务与广播笔记
- Android开发-服务与广播
- android学习之广播发送与检测网络开启服务
- Android项目之广播(BroacastReceiver)与服务(Service)
- 【构建Android缓存模块】(一)吐槽与原理分析
- GDKOI2016 爆零记
- android基础之三——android中的意图及启动模式
- BZOJ_P2431 [HAOI2009]逆序对数列(动态规划)
- Eclipse自动打包教程
- android基础之四——广播与服务(一)
- 评教上线设想
- 15. 3Sum
- 集训队专题(6)1001 Air Raid
- jQuery中的DOM操作
- The mook jong (HDU 5366)
- android基础之四——广播与服务(二)
- WebSocket 实战
- URL之好资源整理(看云平台)