Android09
来源:互联网 发布:php程序员简历项目经验 编辑:程序博客网 时间:2024/06/06 02:13
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>@Overridepublic 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> --------------------------------------------//不用配清单,是发广播的内线public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("我是恩恩的内线,微服私访:"); System.out.println(getResultData()); }}
系统的一些广播接收者的类型
有屏幕开启,省电管理
ScreenStatusReceiver receiver;@Overrideprotected 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);}@Overrideprotected 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(); } } }
- Android09
- Android09--Android之Handler机制
- Android09之布局属性大全(转)
- Android09--Android之Application的应用
- Android09--Android之内存优化-bitmap详解
- Chapter 14: Combining Models
- 数据结构实验之排序五:归并求逆序数(讲解归并排序算法)
- Ubuntu 16.04 自学之 JDK
- layer 实现弹窗提交信息
- Facebook登录申请流程
- Android09
- JavaSE总结 -集合框架collection
- 数据结构图的基本操作--邻接表法(不包括深度、广度算法)
- Ajax之判断用户名是否存在
- Android10
- 虚拟机上下载Android源码
- 自动创建hibernate的hbm.xml文件失败
- LDA的Gibbs抽样详细推理与理解
- 第十五周OJ项目K包含B的字符