内容提供者(ContentProvider)和内容观察者(ContentObserver)的使用(以应用锁为例)
2017-07-21 14:47
549 查看
内容提供者(ContentProvider)
内容观察者(ContentObserver)
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中注册
相关文章推荐
- 内容提供者ContentProvider和内容观察者ContentObserver的使用
- android内容提供者ContentProvider,UriMatcher和内容观察者ContentObserver常见使用
- Android ContentProvider之ContentObserver内容观察者
- Android应用:ContentResolver内容观察者的使用
- android ContentObserver内容观察者基本使用
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
- 内容观察者(ContentObserver)的使用~
- android之ContentObserver内容观察者的使用
- Android中内容观察者的使用---- ContentObserver
- android之contentProvider的使用以及为其添加观察者(ContentObserver)
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- 使用内容观察者(ContentObserver)来观察 蓝牙 打开和关闭的状态
- 关于Android sqlite3数据库创建使用内容提供者contentProvider及解析者ContentResolver,观察者ContentResolver案例
- Android学习笔记_10_ContentProvider内容提供者的使用
- android 使用contentobserver监听数据库内容变化
- Android 使用ContentProvider(内容提供者)共享数据
- [Android Pro] 内容提供者ContentProvider的基本使用
- Android -- ContentObserver 内容观察者
- 使用ContentProvider(内容提供者)共享数据
- Android内容观察者 --ContentObserver(待写)