Android--手机卫士涉及的知识点总结(五)

简介: 主活动中点击切换 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

主活动中点击切换

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
     package com.cca.mobilephone.activity;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
import com.cca.mobilephone.R;
import com.cca.mobilephone.db.dao.AppClockDao;
import com.cca.mobilephone.domain.AppInfo;
import com.cca.mobilephone.engine.AppManagerInfos;
/**
  * 设置程序加锁的Activity
  * @author Administrator
  *
  */
public class AppLockedActivity extends Activity implements OnClickListener {
 
private TextView app_unlock;
private TextView app_locked;
/**
  * 两种线性布局
  */
private LinearLayout ll_applocked;
private LinearLayout ll_appunlock;
/**
  * 两种listview
  */
private ListView lv_locked;
private ListView lv_unlock;
/**
  * 正在加载的进度条
  */
private LinearLayout ll_loading;
/**
  * 所有程序的集合
  */
private List infos;
/**
  * 显示未加锁程序的个数
  */
private TextView tv_unlock_count;
/**
  * 显示加锁程序的个数
  */
private TextView tv_locked_count;
/**
  * 加锁的数据库
  */
private AppClockDao dao;
/**
  * 加锁集合
  */
private List lockedInfo;
/**
  * 未加锁集合
  */
private List unlockInfo;
/**
  * 未加锁
  */
private MylockAdapter unlockadapter;
/**
  * 加锁适配器
  */
private MylockAdapter lockedadapter;
 
private Handler handler= new Handler(){
     public void handleMessage(android.os.Message msg) {
         // 加载未加锁的适配器
         lv_unlock.setAdapter(unlockadapter);
         // 加载加锁的适配器
         lv_locked.setAdapter(lockedadapter);
         ll_loading.setVisibility(View.INVISIBLE);
     };
};
 
@Override
protected void onCreate(Bundle savedInstanceState) {
     super .onCreate(savedInstanceState);
 
     setContentView(R.layout.activity_applocked);
     tv_unlock_count = (TextView) findViewById(R.id.tv_unlock_count);
     tv_locked_count = (TextView) findViewById(R.id.tv_locked_count);
 
     ll_loading=(LinearLayout) findViewById(R.id.ll_loading);
     dao = new AppClockDao( this );
 
     app_unlock = (TextView) findViewById(R.id.app_unlock);
     app_locked = (TextView) findViewById(R.id.app_locked);
     // 两种listview
     lv_locked = (ListView) findViewById(R.id.lv_locked);
     lv_unlock = (ListView) findViewById(R.id.lv_unlock);
     // 两个不同点击事件
     app_locked.setOnClickListener( this );
     app_unlock.setOnClickListener( this );
     // 两个线性布局
     ll_applocked = (LinearLayout) findViewById(R.id.ll_applocked);
     ll_appunlock = (LinearLayout) findViewById(R.id.ll_appunlock);
 
     lockedInfo = new ArrayList();
     unlockInfo = new ArrayList();
     unlockadapter = new MylockAdapter( true );
     lockedadapter = new MylockAdapter( false );
 
     new Thread(){
         public void run() {
     // 获得全部软件程序
     infos = AppManagerInfos.getAppManagerInfos(getApplicationContext());
 
     /**
      * 遍历集合,区分加锁和未加锁
      */
     for (AppInfo info : infos) {
         if (dao.find(info.getPakageName())) {
             lockedInfo.add(info);
         } else {
             unlockInfo.add(info);
         }
     }
             handler.sendEmptyMessage( 0 );
         };
     }.start();
 
}
 
@Override
public void onClick(View v) {
     switch (v.getId()) {
     case R.id.app_unlock: // 点击未加锁
         ll_appunlock.setVisibility(View.VISIBLE);
         ll_applocked.setVisibility(View.GONE);
         app_unlock.setBackgroundResource(R.drawable.tab_left_pressed);
         app_locked.setBackgroundResource(R.drawable.tab_left_default);
 
         break ;
     case R.id.app_locked: // 点击已加锁
         ll_appunlock.setVisibility(View.GONE);
         ll_applocked.setVisibility(View.VISIBLE);
         app_unlock.setBackgroundResource(R.drawable.tab_left_default);
         app_locked.setBackgroundResource(R.drawable.tab_left_pressed);
 
         break ;
     }
}
private class MylockAdapter extends BaseAdapter {
     /**
      * isunlock是否加锁的标识符 true 为未加锁 、 false 已加锁
      */
     boolean isunlock;
 
     public MylockAdapter( boolean isunlock) {
         this .isunlock = isunlock;
     }
     @Override
     public int getCount() {
         int count = 0 ;
         if (isunlock) {
             count = unlockInfo.size();
             tv_unlock_count.setText( "未加锁软件:" + count);
         } else {
             count = lockedInfo.size();
             tv_locked_count.setText( "加锁软件:" + count);
         }
 
         return count;
     }
 
     @Override
     public View getView( int position, View convertView, ViewGroup parent) {
         final View view;
         ViewHolder holder;
         if (convertView != null && convertView instanceof RelativeLayout) {
             view = convertView;
             holder = (ViewHolder) view.getTag();
         } else {
             view = View.inflate(getApplicationContext(),
                     R.layout.item_unlock_app, null );
             holder = new ViewHolder();
             holder.img_appicom = (ImageView) view
                     .findViewById(R.id.img_appicom);
             holder.tv_appname = (TextView) view
                     .findViewById(R.id.tv_appname);
             holder.img_locked = (ImageView) view
                     .findViewById(R.id.img_locked);
             view.setTag(holder);
         }
 
         final AppInfo info;
         if (isunlock) {
             info = unlockInfo.get(position);
             holder.img_locked
                     .setImageResource(R.drawable.list_button_lock_pressed);
         } else {
             info = lockedInfo.get(position);
             holder.img_locked
                     .setImageResource(R.drawable.list_button_unlock_pressed);
 
         }
 
         holder.img_appicom.setImageDrawable(info.getIcon());
         holder.tv_appname.setText(info.getAppname());
         /**
          * 点击加锁按钮移出条目,把数据加到数据库
          */
         holder.img_locked.setOnClickListener( new OnClickListener() {
             @Override
             public void onClick(View v) {
 
                 if (isunlock) {
                     TranslateAnimation am = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0 ,
                             Animation.RELATIVE_TO_SELF, 1 .0f,
                             Animation.RELATIVE_TO_SELF, 0 ,
                                             Animation.RELATIVE_TO_SELF, 0 );    
                     am.setDuration( 500 );
                     view.startAnimation(am);
                     am.setAnimationListener( new AnimationListener() {
                         @Override
                         public void onAnimationStart(Animation animation) {
                         }
                         @Override
                         public void onAnimationRepeat(Animation animation) {
                         }
                         @Override
                         public void onAnimationEnd(Animation animation) {
                             // 未加锁
                             unlockInfo.remove(info);
                             lockedInfo.add(info);
                             dao.insert(info.getPakageName());
                             // 通知界面更新
                             // notifyDataSetChanged();
                             unlockadapter.notifyDataSetChanged();
                             lockedadapter.notifyDataSetChanged();
                         }
                     });
 
                 } else {
                     TranslateAnimation am = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0 ,
                             Animation.RELATIVE_TO_SELF, - 1 .0f,
                             Animation.RELATIVE_TO_SELF, 0 ,
                                             Animation.RELATIVE_TO_SELF, 0 );    
                     am.setDuration( 500 );
                     view.startAnimation(am);
                     am.setAnimationListener( new AnimationListener() {
                         @Override
                         public void onAnimationStart(Animation animation) {
                         }
                         @Override
                         public void onAnimationRepeat(Animation animation) {
                         }
                         @Override
                         public void onAnimationEnd(Animation animation) {
                             // 已经加锁
                             lockedInfo.remove(info);
                             unlockInfo.add(info);
                             dao.delete(info.getPakageName());
                             // 通知界面更新
                             // notifyDataSetChanged();
                             unlockadapter.notifyDataSetChanged();
                             lockedadapter.notifyDataSetChanged();
                         }
                     });
 
                 }
 
             }
         });
 
         return view;
     }
 
     @Override
     public Object getItem( int position) {
         return null ;
     }
 
     @Override
     public long getItemId( int position) {
         return 0 ;
     }
}
 
static class ViewHolder {
     TextView tv_appname;
     ImageView img_appicom;
     ImageView img_locked;
}
</appinfo></appinfo></appinfo></appinfo></appinfo>

}

在Service中开启一个活动Activity 在Activity往Service中发送信息采用自定义广播,只有服务才能接收:

活动中:

?
1
2
3
4
Intent intent= new Intent();
intent.setAction( "com.cca.mobilesafe.watchdog" );
intent.putExtra( "packageNmae" ,packageName);
sendBroadcast(intent);

在服务中定义一个内部类广播接收者

?
1
2
3
4
5
6
7
8
private class InnerWatchDogReceiver extends BroadcastReceiver{
     @Override
     public void onReceive(Context context, Intent intent) {
 
         temppackageName = intent.getStringExtra( "packageName" );
 
     }
}

在onCreate方法中注册广播接收者:

?
1
2
3
4
5
//注册一个广播接收者
receiver= new InnerWatchDogReceiver();
IntentFilter filter= new IntentFilter();
filter.addAction( "com.cca.mobilephone.watchdog" );
registerReceiver(receiver, filter);

程序锁的主逻辑

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.cca.mobilephone.service;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
 
import com.cca.mobilephone.activity.EnterPasswordActivity;
import com.cca.mobilephone.db.dao.AppClockDao;
/**
  * 看门狗服务,监视运行的软件
  * @author Administrator
  *
  */
public class WatchDogLockService extends Service {
 
     private ActivityManager am;
     private boolean flags;
     private AppClockDao dao;
     private InnerWatchDogReceiver receiver;
/**
  * 临时不需要保护的包名
  */
     private String temppackageName;
     @Override
     public IBinder onBind(Intent intent) {
         return null ;
 
     }
 
     @Override
     public void onCreate() {
         super .onCreate();
         //注册一个广播接收者
         receiver= new InnerWatchDogReceiver();
         IntentFilter filter= new IntentFilter();
         filter.addAction( "com.cca.mobilephone.watchdog" );
         registerReceiver(receiver, filter);
 
         //获取活动管理器
         am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
         flags= true ;
         dao= new AppClockDao( this );
         new Thread(){
                 public void run() {
                 while (flags){
                 //获取任务站里面的情况,对于任务栈里面的信息进行排序,最近使用的排在最前面
                  List<runningtaskinfo> infos = am.getRunningTasks( 100 );
                 String packageName=infos.get( 0 ).topActivity.getPackageName();
                     if (dao.find(packageName)){
                         //程序需要被保护,弹出一个输入密码的对话框
 
                         //再次判断是否需要保护
                         if (packageName.equals(temppackageName)){
                             //暂时不需要保护
                         } else {
                             //需要保护
                             Intent intent = new Intent(getApplicationContext(),EnterPasswordActivity. class );
                             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                             intent.putExtra( "packageName" , packageName);
                             startActivity(intent);
                         }
                     } else {
                         //程序不需要被保护
                     }
                     try {
                         Thread.sleep( 200 );
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             };
         }.start();
     }
     @Override
     public void onDestroy() {
         super .onDestroy();
         flags= false ;
         unregisterReceiver(receiver);
         receiver= null ;
     }
     /**
      * 定义内部类广播接收者,接收不需要保护的程序包名
      * @author Administrator
      *
      */
     private class InnerWatchDogReceiver extends BroadcastReceiver{
         @Override
         public void onReceive(Context context, Intent intent) {
             temppackageName = intent.getStringExtra( "packageName" );
         }
     }
}
</runningtaskinfo>

程序的优化:考虑每个细节执行的时间,可以优化就优化

当有手机卫士在后台运行时,界面的跳转就不正常了,需要为打开密码保护的程序Activity设置一个模式:打开运用时会在一个新的任务栈中运行,这样就不会跳转回手机卫士了

?
1
android:launchMode= "singleInstance"

在低版本时运行还没弹出密码界面就已经进入程序界面了,可以看到一些信息了,需要优化代码,执行效率更快

?
1
2
List<runningtaskinfo> infos = am.getRunningTasks( 100 );
</runningtaskinfo>

这句代码我们只需要获取第一个运用程序的包名

?
1
2
List<runningtaskinfo> infos = am.getRunningTasks( 1 )定义为;
</runningtaskinfo>

并定义为成员变量

优化:查询数据库所消耗的时间比内存中的多,把数据库查询的数据放在内存中,需要使用时到内存中查找即可

优化程序后发现新增加的要保护的程序保护不了,想到数据库查询时已经把数据存储在内存中固定了,所以要重新查询即更新数据,可以使用广播接收者、也可以使用内容观察者来观察数据库的变化,增加和删除一旦发现,重新查询数据存进内存中。

优化后的代码:电量的优化 屏幕锁屏后和锁屏的广播接收者

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
     /**
  * 看门狗服务,监视运行的软件
  * @author Administrator
  *
  */
public class WatchDogLockService extends Service {
 
     private ActivityManager am;
     private boolean flags;
     private AppClockDao dao;
     private InnerWatchDogReceiver receiver;
      private List<runningtaskinfo> infos ;
     private String packageName;
/**
  * 临时不需要保护的包名
  */
     private String temppackageName;
     /**
      * 内容观察者
      */
     private AppClockDaoObserver observer;
     private Intent intent;
     private List<string> packname;
     @Override
     public IBinder onBind(Intent intent) {
         return null ;
 
     }
 
     @Override
     public void onCreate() {
         super .onCreate();
         //注册一个广播接收者
         receiver= new InnerWatchDogReceiver();
         IntentFilter filter= new IntentFilter();
         filter.addAction( "com.cca.mobilephone.watchdog" );
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(Intent.ACTION_SCREEN_ON);
         registerReceiver(receiver, filter);
 
         intent = new Intent(getApplicationContext(),EnterPasswordActivity. class );
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
         //获取活动管理器
         am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
 
         dao= new AppClockDao( this );
         packname = dao.findAll();
 
         //注册一个内容观察者
         Uri uri=Uri.parse( "content://com.cca.mobilephone.appclockdb" );
         observer= new AppClockDaoObserver( new Handler());
         getContentResolver().registerContentObserver(uri, true , observer);
 
         showWhatchDogStart();
     }
     /*
     *对电量的优化,锁屏后停止监控
     *
     */
     public void showWhatchDogStart() {
         if (flags== false ){
             return ;
         }
         flags= true ;
         new Thread(){
                 public void run() {
                 while (flags){
                 //获取任务站里面的情况,对于任务栈里面的信息进行排序,最近使用的排在最前面
                     infos= am.getRunningTasks( 1 );
                     packageName=infos.get( 0 ).topActivity.getPackageName();
                     if (packname.contains(packageName)){
                         //程序需要被保护,弹出一个输入密码的对话框
                         //再次判断是否需要保护
                         if (packageName.equals(temppackageName)){
                             //暂时不需要保护
                         } else {
                             //需要保护
 
                             intent.putExtra( "packageName" , packageName);
                             startActivity(intent);
                         }
                     } else {
                         //程序不需要被保护
                     }
                     try {
                         Thread.sleep( 30 );
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             };
         }.start();
     }
     @Override
     public void onDestroy() {
         super .onDestroy();
         flags= false ;
         unregisterReceiver(receiver);
         receiver= null ;
     }
     /**
      * 定义内部类广播接收者
      * @author Administrator
      *
      */
     private class InnerWatchDogReceiver extends BroadcastReceiver{
         @Override
         public void onReceive(Context context, Intent intent) {
             if ( "com.cca.mobilephone.watchdog" .equals(intent.getAction())){
                 temppackageName = intent.getStringExtra( "packageName" );
             } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
                 //屏幕锁屏
                 temppackageName= null ;
                 flags= false ;
             } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())){
                 //屏幕解锁
                 showWhatchDogStart();
             }
         }
     }
     /**
      * 定义内容观察者内部类
      * @author Administrator
      *
      */
     private class AppClockDaoObserver extends ContentObserver{
 
         public AppClockDaoObserver(Handler handler) {
             super (handler);
         }
         //观察到数据库内容发生变化
         @Override
         public void onChange( boolean selfChange) {
             super .onChange(selfChange);
             System.out.println( "内容观察者观察到数据库发生变化了" );
             packname = dao.findAll();
         }
     }
}
</string></runningtaskinfo>

目录
相关文章
|
2月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
|
2月前
|
机器学习/深度学习 人工智能 Android开发
安卓智能手机操作系统演化史
【2月更文挑战第5天】 本文通过对安卓智能手机操作系统的演化历程进行探讨,分析了安卓系统从诞生至今的发展脉络和关键技术革新,从最初的版本到如今的最新版本,探讨了其在移动互联网时代的重要作用,以及未来可能的发展方向。
|
3月前
|
JavaScript Android开发
手机也能搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站
手机也能搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站
33 0
|
1月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
46 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
1月前
|
网络协议 关系型数据库 MySQL
安卓手机termux上安装MariaDB数据库并实现公网环境下的远程连接
安卓手机termux上安装MariaDB数据库并实现公网环境下的远程连接
|
1月前
|
JavaScript Android开发
手机也能轻松搭建个人博客,使用安卓Termux+Hexo建立自己的网站
手机也能轻松搭建个人博客,使用安卓Termux+Hexo建立自己的网站
|
2月前
|
安全 Android开发
如何在Android手机上安装第三方应用?
【2月更文挑战第4天】在Android系统中,安装第三方应用是一个常见的需求。本文将介绍如何在Android手机上安装第三方应用,并提供详细的步骤和注意事项。
150 2
|
3月前
|
安全 网络协议 Linux
【公网远程手机Android服务器】安卓Termux搭建Web服务器
【公网远程手机Android服务器】安卓Termux搭建Web服务器
59 0
|
4月前
|
Android开发
安卓手机快速过检测完成某某学习
安卓手机快速过检测完成某某学习
22 0
|
4月前
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
62 1