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(); } } }
相关文章推荐
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- Android入门逆引手册 - 09 文本框(TextView)的使用
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- 【Android Training - 09】高效地显示Bitmap图片 [ Lesson 3 - 两种缓存Bitmap的方式 ]
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- 【Android Training - 09】高效地显示Bitmap图片 [ Lesson 5 - 使用ViewPager与GridView显示图片 ]
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- 【Android Training - 09】高效地显示Bitmap图片 [ Lesson 0 - 章节概览 ]
- 【Android Training - 09】高效地显示Bitmap图片 [ Lesson 2 - 在UI线程之外处理Bitmaps ]
- 09年底要上市的Q8250 Android 手機...
- android每日一问1【2011-09-09】
- Android开发——09Google I/O之让Android UI性能更高效(1)
- android控件09 PregressBar
- Android基本组件09(ProgressBar)
- Android开发——09Google I/O之让Android UI性能更高效(1)
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- FAQ_09_android支持Java特性
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- Android开发——09Google I/O之让Android UI性能更高效(1)
- Android ApiDemos示例解析(164):Views->Layouts->TableLayout->09. Toggle Shrink