内容提供者(ContentProvider)和内容观察者(ContentObserver)的使用(以应用锁为例)

来源:互联网 发布:中国荒漠化 知乎 编辑:程序博客网 时间:2024/06/07 08:14

内容提供者(ContentProvider)

package com.songyan.applock;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.net.Uri;import android.support.annotation.Nullable;public class AppLockProvider extends ContentProvider {    //分别定义两个返回值    private static final int INSERT=1;    private static final int DELETE=0;    //先new一个UriMatcher出来,参数就是当没有匹配到的时候,返回的值是什么    private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);    private static Uri URI=Uri.parse("content://com.songyan.applock.applockprovider");    private AppLockDao dao;    static {        matcher.addURI("com.songyan.applock.applockprovider","insert",INSERT);        matcher.addURI("com.songyan.applock.applockprovider","delete",DELETE);    }    @Override    public boolean onCreate() {        dao=new AppLockDao(getContext());        return false;    }    @Nullable    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        return null;    }    @Nullable    @Override    public String getType(Uri uri) {        return null;    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues values) {        //上面定义的返回值        int result=matcher.match(uri);        if(result==INSERT){            String packageName=values.getAsString("packageName");            dao.add(packageName);            //如果数据发生了改变就通知            getContext().getContentResolver().notifyChange(URI,null);        }else{            new IllegalArgumentException("URI地址不正确");        }        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        //上面定义的返回值        int result=matcher.match(uri);        if(result==DELETE){            String packageName=selectionArgs[0];            dao.delete(packageName);            //如果数据发生了改变就通知            getContext().getContentResolver().notifyChange(URI,null);        }else{            new IllegalArgumentException("URI地址不正确");        }        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        return 0;    }}

内容观察者(ContentObserver)

package com.songyan.applock;import android.app.ActivityManager;import android.app.ActivityManager.RunningTaskInfo;import android.app.KeyguardManager;import android.app.Service;import android.content.Intent;import android.database.ContentObservable;import android.database.ContentObserver;import android.net.Uri;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.provider.Settings;import android.support.annotation.Nullable;import android.util.Log;import java.util.ArrayList;import java.util.List;public class WatchDogService extends Service{    private AppLockDao dao;    private List<String> apps;    //存放要停止保护的app    private List<String> stopApps;    private ActivityManager activityManager;    private Intent intent;    private boolean flag=true;    private MyBinder myBinder;    //键盘的管理器    private KeyguardManager keyguardManager;    //在服务中定义的具体方法,临时开启对某个应用的保护    private void invokeMethodStartApp(String packageName){        if(stopApps.contains(packageName)){            stopApps.remove(packageName);        }    }    //临时停止对某个应用的保护    private void invokeMethodStopApp(String packageName){        stopApps.add(packageName);    }    private class MyBinder extends Binder implements IService{        @Override        public void startApp(String packageName) {            //在IService接口的方法中引用服务的具体方法            invokeMethodStartApp(packageName);        }        @Override        public void stopApp(String packageName) {            invokeMethodStopApp(packageName);        }    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        //返回在onCreate中初始化的MyBinder对象        return myBinder;    }    @Override    public void onCreate() {        super.onCreate();        keyguardManager=(KeyguardManager)getSystemService(Service.KEYGUARD_SERVICE);        Log.d("songyandebug","service start");        dao=new AppLockDao(this);        apps=dao.getAllPackageName();        stopApps=new ArrayList<>();        myBinder=new MyBinder();        activityManager=(ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);        //注册一个内容观察者        getContentResolver().registerContentObserver(                Uri.parse("content://com.songyan.applock.applockprovider"),                true,new MyObserver(new Handler()));        //MyObserver就是数据库发生变化以后会执行的内容        intent=new Intent(this,LockActivity.class);        //服务里面是没有任务栈的,所以要指定一个新的任务栈,不然是无法在服务里面启动activity的        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        new Thread()        {            public void run(){                while(flag){                    try{                        //得到当前运行的任务栈,参数就是得到多少个任务栈,1就是只拿一个任务栈                        //1对应的也就是正在运行的任务栈啦                        Log.d("songyandebug","service run execute");                        for(String app:apps){                            Log.d("songyandebug","get packageName:"+app);                        }                        List<RunningTaskInfo> runningTaskInfos=activityManager.getRunningTasks(1);                        //拿到当前运行的任务栈                        RunningTaskInfo runningTaskInfo=runningTaskInfos.get(0);                        //拿到要运行的Activity的包名                        String packageName=runningTaskInfo.topActivity.getPackageName();                        Log.d("songyandebug","top runningTask is:"+packageName);                        if(apps.contains(packageName)){                            Log.d("songyandebug","service run execute2");                            intent.putExtra("packageName",packageName);                            startActivity(intent);                            //stopSelf();                        }else{                        }                        sleep(1000);                    }catch (InterruptedException e){                        e.printStackTrace();                    }                }            }        }.start();    }    @Override    public void onDestroy() {        super.onDestroy();        flag=false;    }    private class MyObserver extends ContentObserver{        public MyObserver(Handler handler){            super(handler);            //重新更新apps里面的内容            apps=dao.getAllPackageName();            Log.d("songyan","数据库的内容发生了变化");        }    }}
内容提供者也不要忘记在AndroidManifest.xml中注册


阅读全文
0 0
原创粉丝点击