需要设置flag————Intent.FLAG_ACTIVITY_NEW_TASK
Intent intent = new Intent(WatchDogService.this,EnterPasswordActivity.class);
intent.putExtra(“packname”, packname);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
6.如何监听返回键,打开桌面
@Override
public void onBackPressed() {
//
//
//
Intent intent = new Intent();
intent.setAction(“android.intent.action.MAIN”);
intent.addCategory(“android.intent.category.HOME”);
intent.addCategory(“android.intent.category.DEFAULT”);
startActivity(intent);
}
7.Activity的启动模式
(1)standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
(4)singleInstance:会单独创建一个Activity栈;
8.程序锁的优化
- 将while循环里每次都创建的变量放到循环外面,只创建一次
//修改前
while(flag){
List infos = am.getRunningTasks(1000);
String packname = infos.get(0).topActivity.getPackageName();
//修改后
List infos;
String packname;
while(flag){
infos = am.getRunningTasks(1000);
packname = infos.get(0).topActivity.getPackageName();
- 获取正在运行的应用时,只需要获取到第一个就可以了,将集合大小设置为1
//修改前
infos = am.getRunningTasks(1000);
//修改后
infos = am.getRunningTasks(1);
- 每次都查询数据库比较耗时,将数据库的内容都查询出来,放到一个集合里,以后查询的时候就去查询内存中的集合数据
//修改前
if(dao.find(packname)){//每次都查询数据库
//修改后
1.在ApplockDao中添加一个查询所有已加锁应用的方法
public List findAll() {
List lockedPacknames = new ArrayList();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery(“select packname from lockinfo”, null);
while (cursor.moveToNext()) {
lockedPacknames.add(cursor.getString(0));
}
cursor.close();
db.close();
return lockedPacknames;
}
2.声明一个成员变量,onCreate方法中将所有数据查询出来
private List lockedPacknames;
@Override
public void onCreate() {
…
…
//获取的是数据库锁定的全部的包名
lockedPacknames = dao.findAll();
…
…
}
3.查询的时候直接去查询内存中的数据
if(lockedPacknames.contains(packname)){//查询内存
9. 如何利用内容观察者同步数据库变化
- 在AppLockDao中的add和delete方法中,加入修改数据库的通知
//添加或删除一条记录
Uri uri = Uri.parse(“content://com.mythmayor.project.applockdb”);
context.ge
tContentResolver().notifyChange(uri, null);
- 在WatchDogService中注册内容观察者
//注册内容观察者观察数据库内容的变化
Uri uri = Uri.parse(“content://com.mythmayor.project.applockdb”);
observer = new MyObserver(new Handler());
getContentResolver().registerContentObserver(uri, true, observer);
//内容观察者
private class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
}
//内容观察者观察到数据变化调用的方法
@Override
public void onChange(boolean selfChange) {
Log.i(TAG,“看门狗里面的内容观察者观察到了数据库变化。。。。”);
lockedPacknames = dao.findAll();
super.onChange(selfChange);
}
}
上面的方式在观察到数据库的变化时,又重新查询了所有的数据,还是不够优化,实际上我们在add或者delete时只是对一条数据进行了操作,可以利用uri将add或者delete的数据通知出来
- 在AppLockDao中的add和delete方法中,加入修改数据库的通知,通知时带出操作和所操作的包名
//添加数据
Uri uri = Uri.parse(“content://com.mythmayor.project.applockdb?add=”+packname);
context.getContentResolver().notifyChange(uri, null);
//删除数据
Uri uri = Uri.parse(“content://com.mythmayor.project.applockdb?delete=”+packname);
context.getContentResolver().notifyChange(uri, null);
- 在WatchDogService中注册内容观察者,根据不同的uri,做出不同的操作
private class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
// TODO Auto-generated method stub
String query = uri.getQuery();
Log.i(TAG, “query—>”+query);
Set names = uri.getQueryParameterNames();
for(String name : names){
Log.i(TAG, “name—>”+name);
List parameters = uri.getQueryParameters(name);
for(String parameter : parameters){
Log.i(TAG, “parameter—>”+parameter);
}
}
super.onChange(selfChange);
}