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();                }            }        }
0 0
原创粉丝点击