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

内容提供者(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中注册


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值