您的位置:首页 > 移动开发 > Android开发

Android09

2016-12-11 21:18 369 查看

Android09

sd卡状态监听

1.买个收音机

public class SDCardStatusReceiver extends BroadcastReceiver


2.装电池

3.调频道 ,意图过滤器

</receiver>


4.逻辑

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "外部存储卡已被拔出,微信头像和朋友圈功能暂不可用", 0).show();
}


开机启动的广播接收者

public class BootCompleteReceiver extends BroadcastReceiver

<receiver android:name="com.itheima.bootcomplete.BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" >//系统
</action>
</intent-filter>
</receiver>
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("手机启动完毕了...");
Intent i = new Intent(context,MainActivity.class);
//在广播接受者里面开启Activity需要记得加一个flag
// FLAG_ACTIVITY_NEW_TASK 告知Activity运行在自己的任务栈里面,因为广播接受者里面不存在上下文
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}

@Override//禁止返回键
public void onBackPressed() {

}


外拨电话的广播接收者

SharedPreferences存储ip号码

public class MainActivity extends Activity {
private EditText et_ipnumber;
private SharedPreferences sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_ipnumber = (EditText) findViewById(R.id.et_ipnumber);
sp = getSharedPreferences("config", 0);
et_ipnumber.setText(sp.getString("ipnumber", ""));
}

public void save(View view){
String ipnumber = et_ipnumber.getText().toString().trim();
Editor editor = sp.edit();
editor.putString("ipnumber", ipnumber);
editor.commit();
Toast.makeText(this, "设置成功", 0).show();
}

}


ip接收器监听

public class OutCallRecevier extends BroadcastReceiver

//清单配置
<receiver android:name="com.itheima.ipdail.OutCallRecevier" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />//监听电话
</intent-filter>
</receiver>
//权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

//执行逻辑
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sp = context.getSharedPreferences("config", 0);
String ipnumber = sp.getString("ipnumber", "");//ip值地址
String number = getResultData();//接收者得到本地,系统取值
if (number.startsWith("0")) {
setResultData(ipnumber + number);
}
}


软件的安装和卸载

代码注册广播

public class AppStatusReceiver extends BroadcastReceiver

<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>
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();//由意图得到数据,卸载
if("android.intent.action.PACKAGE_ADDED".equals(action)){
System.out.println("有应用程序被安装了:"+intent.getData().toString());
}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
System.out.println("有应用程序被卸载了:"+intent.getData().toString());
}
}


短信窃听器(有序广播)

public class SmsReceiver extends BroadcastReceiver

<receiver android:name="com.itheima.smslistener.SmsReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />//这里没有提示的
</intent-filter>
</receiver>
权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />


接收短信走这里

@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();//被拦截
}
}


不同版本系统广播接收者的特点

2.3版本停掉接受短信进程,发送短信,还是可以接受到了

4.0版本停掉接受短信进程,发送短信,是接受不到的,应用是冻结状态

自定义广播消息和广播接收者

一个项目中(无序)

//发送自定义的广播.

public void click(View view){
Intent intent = new Intent();
intent.setAction("com.itheima.ccav.XWLB");
intent.putExtra("key", "dfafadfa");
sendBroadcast(intent);//开启广播
}


在另一个项目中

public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("哈哈哈,我们接收到了自定义的广播消息");
System.out.println(intent.getStringExtra("key"));
}
}

//对应com.itheima.ccav.XWLB
<receiver android:name="com.itheima.myreceiver.MyReceiver">
<intent-filter >
<action android:name="com.itheima.ccav.XWLB"/>
</intent-filter>
</receiver>


自定义有序广播

有序广播

广播消息是按照一定的顺序传达的,高优先级的先得到广播消息,低优先级的后得到,高优先级的可以拦截广播消息或者修改广播消息,效率比较低.

无序广播

广播消息没有顺序,同时接受广播消息,效率高(新闻联播)

有序广播的特点

public void sendMashroom(View view){
Intent intent = new Intent();
intent.setAction("com.itheima.gov.SENDMASHROOM");
//发送有序广播
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 1, "主席讲话: 每人10斤蘑菇", null);
}

--------------------------------------------
public class ShengReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = getResultData();
System.out.println("我是省级部门,接受到了中央的指令,"+data);
setResultData("主席讲话:每人5斤蘑菇");
}

}

public class ShiReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String data = getResultData();//得到数据
System.out.println("我是市级部门,接受到了中央的指令,"+data);
setResultData("主席讲话:每人3斤蘑菇");//设置数据
}

}

<receiver android:name="com.itheima.gov.ShengReceiver" >
<intent-filter android:priority="1000" >//优先级
<action android:name="com.itheima.gov.SENDMASHROOM" />
</intent-filter>
</receiver>
<receiver android:name="com.itheima.gov.ShiReceiver" >
<intent-filter android:priority="800" >
<action android:name="com.itheima.gov.SENDMASHROOM" />
</intent-filter>
</receiver>
------------------------------------------
9ac6
--
//不用配清单,是发广播的内线
public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
System.out.println("我是恩恩的内线,微服私访:");
System.out.println(getResultData());
}
}


系统的一些广播接收者的类型

有屏幕开启,省电管理

ScreenStatusReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//注册广播接受者
receiver = new ScreenStatusReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(receiver, filter);
}

@Override
protected void onDestroy() {
// 取消注册广播接受者
unregisterReceiver(receiver);
receiver = null;
super.onDestroy();
}

------------------------------------
public class ScreenStatusReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("action:"+action);
}

}


只能用代码注册的广播事件

在android里面有一些非常频繁的广播事件,在清单文件里面配置是不会生效.

这个时候就需要代码注册广播去实现

例如:电量变化 屏幕锁屏/解锁

服务概念入门

服务是没有界面的组件,运行在后台,服务是运行在当前应用程序进程里

服务简单入门

public class DemoService extends Service

@Override//重写
public IBinder onBind(Intent intent) {
return null;
}

//清单
<service android:name="com.itheima.servicedemo.DemoService" />

// 服务第一次被创建调用的代码
@Override
public void onCreate() {
super.onCreate();//耗时操作,开子线程
new Thread() {
public void run() {
flag = true;
while (flag) {
System.out.println("检查是否有usb设备插入进来了.");
SystemClock.sleep(2000);
}
};
}.start();
}

@Override
public void onDestroy() {
System.out.println("服务被销毁了.");
flag = false;
super.onDestroy();
}

---------------------------------------------
// 开启服务
public void start(View view) {
Intent intent = new Intent(this,DemoService.class);
startService(intent);
}

// 停止服务
public void stop(View view) {
Intent intent = new Intent(this,DemoService.class);
stopService(intent);
}


进程的优先级

•Foreground process

前台进程:用户正在操作的应用程序进程叫做前台进程

•Visible process

可视化进程:用户已经不能操作这个应用程序了,但是用户还能看到应用程序界面

•Service process

服务进程:应用程序服务在后台运行

•Background process

后台进程:应用程序界面被用户最小化

•Empty process

空进程:应用程序没有任何的activity和service运行

前台进程 > 可视化进程 > 服务进程 > 后台进程 > 空进程

为什么需要使用服务

当服务和子线程,都可以完成同一个操作时,内存不足,需要回收,会先回收空进程(子线程),服务的优先级比较高,一般不会回收.

服务的生命周期

生命周期

onCreate() -> onstartcommand() -> onstart() -> onDestroy()

•用start方法开启服务,服务只会被创建一次,执行一次onCreate方法,一旦服务创建完成,后续调用start去开启服务只会执行onstart和onstartcommand方法

•当调用了stop方法,服务只会调用一次onDestroy方法

简易音乐播放器

public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent = new Intent(this,MusicService.class);
switch (v.getId()) {
case R.id.pause:// 暂停
intent.putExtra("action", 0);
break;
case R.id.stop:// 停止
intent.putExtra("action", 1);
break;
case R.id.play:// 播放
intent.putExtra("action", 2);
break;
}
startService(intent);//开服
}
}

@Override
public void onBackPressed() {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("提醒:");
builder.setMessage("是否在后台继续播放音乐?");
builder.setPositiveButton("继续播放", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("停止播放", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(MainActivity.this,MusicService.class);
stopService(intent);
finish();
}
});
builder.show();
}

----------------------------------------------
<service android:name="com.itheima.mp3player.MusicService" >
</service>

public class MusicService extends Service {
//多媒体的播放器
private MediaPlayer mediaPlayer ;
public static String path;

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(path);
mediaPlayer.setLooping(false);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(MusicService.this, "播放完毕了", 0).show();
mediaPlayer.seekTo(0);
mediaPlayer.start();
}
});
mediaPlayer.prepare();//准备开始播放音乐
} catch (Exception e) {
e.printStackTrace();
}
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int action = intent.getIntExtra("action", -1);
switch (action) {
case 0://暂停
pause();
break;
case 1://停止
stop();
break;
case 2://播放
play();
break;
}
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();//释放播放器.
}
super.onDestroy();
}

public void play(){
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
}
}

public void pause(){
if(mediaPlayer!=null && mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
}

public void stop(){
if(mediaPlayer!=null){
mediaPlayer.stop();
//停止掉播放器之后立刻的重新准备好.
try {
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐