zoukankan      html  css  js  c++  java
  • android86 监听SD卡状态,勒索软件,监听应用的安装、卸载、更新,无序广播有序广播

              

    * 添加权限
      <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    * 4.0以后广播接收者安装以后必须手动启动一次,否则不生效
    * 4.0以后广播接收者如果被手动关闭,就不会再启动了
    
    ------------------------------------------------------------------------
    #监听SD卡状态
    * 清单文件中定义广播接收者接收的类型,监听SD卡常见的三种状态,所以广播接收者需要接收三种广播
    
             <receiver android:name="com.itheima.sdlistener.SDStatusReceiver">
                <intent-filter >
                    <action android:name="android.intent.action.MEDIA_MOUNTED"/>  SD卡就绪广播
                    <action android:name="android.intent.action.MEDIA_REMOVED"/>  SD卡移除广播
                    <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> SD卡拔出广播
                    <data android:scheme="file"/>  系统发送广播的时候带了数据
                </intent-filter>
            </receiver>
    * 广播接收者的定义
    
            public class SDCardReceiver extends BroadcastReceiver {
                @Override
                public void onReceive(Context context, Intent intent) {
                    // 区分接收到的是哪个广播
                    String action = intent.getAction();
                        
                    if(action.equals("android.intent.action.MEDIA_MOUNTED")){
                        System.out.println("sd卡就绪");
                    }
                    else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){
                        System.out.println("sd卡被移除");
                    }
                    else if(action.equals("android.intent.action.MEDIA_REMOVED")){
                        System.out.println("sd卡被拔出");
                    }
                }
            }
    
    ------------------------------------------------------------------------
    #勒索软件
    * 接收开机广播,在广播接收者中启动勒索的Activity
    * 清单文件中配置接收开机广播
    
            <receiver android:name="com.itheima.lesuo.BootReceiver">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>
    * 权限
    
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>   接收开机成功广播的权限
    
    * 定义广播接收者
    
            @Override
            public void onReceive(Context context, Intent intent) {
                //开机的时候就启动勒索软件
                Intent it = new Intent(context, MainActivity.class);        
                context.startActivity(it);
            }
    * 以上代码还不能启动MainActivity,因为广播接收者的启动,并不会创建任务栈,那么没有任务栈,就无法启动activity
    * 手动设置创建新任务栈的flag
    
            it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    ------------------------------------------------------------------------
    #监听应用的安装、卸载、更新
    > 原理:应用在安装卸载更新时,系统会发送广播,广播里会携带应用的包名
    * 清单文件定义广播接收者接收的类型,因为要监听应用的三个动作,所以需要接收三种广播
    
            <receiver android:name="com.itheima.applistener.APPStatusReceiver">
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_ADDED"/>  应用安装消息
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>应用更新消息
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>应用卸载消息
        <data android:scheme="package"/>发送广播时携带的data是安装删除软件的包名
    </intent-filter>
    </receiver>
    * 广播接收者的定义
    
            public void onReceive(Context context, Intent intent) {
                //区分接收到的是哪种广播
                String action = intent.getAction();
                //获取广播中包含的data,应用软件的包名
                Uri uri = intent.getData();
                if(action.equals("android.intent.action.PACKAGE_ADDED")){
                    System.out.println(uri + "被安装了");
                }
                else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
                    System.out.println(uri + "被更新了");
                }
                else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
                    System.out.println(uri + "被卸载了");
                }
            }
    
    -----------------------------------------------------------------------
    #广播的两种类型(广播可以跨应用进行)
    * 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到,不能修改广播数据并且不可以截断广播* 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序(可以截断广播)
    
        * 优先级的定义:-1000~1000
        * 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
        * abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
    
    package com.itheima.center;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.view.Menu;
    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 click(View v){
            Intent intent = new Intent();
            intent.setAction("com.itheima.fdm");
            
            //发送有序广播
            //new MyReceiver()这个resultReceiver:不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后一个收到该广播,并且一定可以收到该广播(即使被截断了也能够收到)
            sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每人发100斤大米", null);
        }
        
        //
        class MyReceiver extends BroadcastReceiver{
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String text = getResultData();
                System.out.println("反贪局收到文件:" + text);
                
            }
            
        }
    }
    /*清单文件:
    <receiver android:name="com.itheima.local.ShengZF">
        <intent-filter android:priority="1000">
            <action android:name="com.itheima.fdm"/>
        </intent-filter>
    </receiver>
    <receiver android:name="com.itheima.local.ShiZF">
        <intent-filter android:priority="800">
            <action android:name="com.itheima.fdm"/>
        </intent-filter>
    </receiver>
    <receiver android:name="com.itheima.local.XianZF">
        <intent-filter android:priority="600">
            <action android:name="com.itheima.fdm"/>
        </intent-filter>
    </receiver>*/
    
    
    
    
    package com.itheima.local;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class ShengZF extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            String text = getResultData();
            System.out.println("省政府收到文件:" + text);
            setResultData("每人发80斤大米");
            abortBroadcast();//广播不再传递
        }
    
    }
  • 相关阅读:
    shell读取文件不改变文本格式
    lua 的 os.date os.time
    gerrit 操作
    docker 的 镜像生成系列
    Windows 跟 Linux 文件共享:Samba 设置
    viscode 使用 格式的配置
    python pip 升级 或者换源
    centos 的系统管理命令 service systemctl
    Linux 的 netstat 命令
    MVC 、MTV 模式
  • 原文地址:https://www.cnblogs.com/yaowen/p/4948131.html
Copyright © 2011-2022 走看看