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();//广播不再传递
        }
    
    }
  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/yaowen/p/4948131.html
Copyright © 2011-2022 走看看