您的位置:首页 > 编程语言 > PHP开发

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

2017-07-21 14:47 549 查看
内容提供者(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中注册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐