赞
踩
- 1、电台:中央人民广播电台 93.4mhz;
- 2、收音机:买一个收音机,插上电池,调整到一个频道,接收广播;
-
- Android系统中内置了广播电台(系统自带的广播功能),会广播出来一些事件(电量不足、电量
- 充满、接收到短信、外拨电话、拨进来电话、SD状态、开机启动等),指定了接收者广播消息的客
- 户端软件(自己开发的应用程序)可以做一些对用户有用的事情。
- 在拨打电话的时候,把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>
- 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>
测试的时使用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>
- 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>
代码:
- 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>
- 自定义广播的代码:
-
- Intent intent = new Intent();
- //设置广播的事件类型
- intent.setAction("com.itheima.broadcast.FSZDYGB");
- //设置广播传递的数据
- intent.putExtra("info", "自定义的广播消息");
-
- //发送广播消息
- sendBroadcast(intent);
- 有序广播:当广播消息发送出去之后,可以根据广播接收者的优先级的高低,从高到低一级一级的传递消息;
- 无序广播:当广播消息发送出去之后,只要是指定了广播事件类型的广播接收者都可以接受到这个消息;
发送有序的广播:
自定义的有序广播:
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 {
- @Override
- protected 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>
- 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都关闭了,任务栈清空了。
- 特点:
-
- 1、服务第一次被开启的时候,系统创建一个服务对象,调用onCreate、onStartCommand;
- 2、服务职能被创建一次,可以被开启多次,多次开启只会调用onStartCommand;
- 3、停止服务调用onDestroy方法,服务只能被停止一次;
- 4、服务没有界面,可以长期运行在后台;
-
- 服务的应用场景:
- 当需要在后台运行一段程序,程序需要与服务器端通讯;
- 在后台运行一段程序,监听电话的状态,当电话铃声响起的时候,创建一个录音机;当电话接通的时候,使用录音机开始录音;当电话挂断的时候,录音机停止录音,上传录制的音频文件;
-
- 实现步骤:
-
- 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 {
-
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public 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;
- }
- }
-
- }
}
- 代码:
-
- 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;
-
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public 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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。