昨天,我们把程序管理这个功能给做好啦,那么今天,我们就继续着来写一下那个程序锁的功能,程序锁就是,当用户锁定某一个应用的时候,如果要想打开它的话,那么就会提示输入密码,不然是无法打开的。
要做到这样的功能,那么首先就必须要先知道用户要找开的应用啦,那么我们怎样知道用户要打开那一个应用呢,
我们可以这样做,我们开启一个服务,然后不停的监听手机的任务栈,这样,我们就可以拿到栈里面运行的应用啦,然后判断一下,这个应用是不是被我们锁定的啦,如果是,那就先进入输入密码的界面,如果不是,那就照常运行。
但现在问题来了,我们知道服务有两种启动方法,一种是startService,一种是bindService,因为我们这个功能的特殊性,我们是必须要调用服务里面的方法的,那么调用服务里面的方法,我们就必须要使用bindService这种开启服务的方法的啦。但是这种开启服务的方法是有点问题,就是如果开启服务的那个activity被回收了,那么,服务也就被关闭啦
所以我们就必须想办法,能让服务一直启动,而且也能调用服务里面的方法,这也是这个程序锁的核心所有了,后面我们就会为大家讲解的了,今天我们就先把界面给大家做出来先,先来看一下效果
其实这个界面是和前面的程序管理的界面是差不多的,就是在后面多了一个锁的图标
我们今天就只把界面先写一下,加锁的逻辑以及一些动画,我们就明天再说
app_lock.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="40dip" android:gravity="center_vertical|center_horizontal" android:background="@drawable/title_background" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="22sp" android:text="@string/app_lock"/> </LinearLayout> <ListView android:id="@+id/lv_app_lock" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dip"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="65dip" android:gravity="center_vertical" android:background="@drawable/item_background_selector"> <ImageView android:id="@+id/iv_app_lock_icon" android:layout_width="60dip" android:layout_height="60dip" android:scaleType="fitXY" android:src="@drawable/app" android:contentDescription="@string/hello_world"/> <TextView android:id="@+id/tv_app_lock_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginTop="5dip" android:textSize="18sp" android:textColor="#ff000000"/> <ImageView android:id="@+id/iv_app_lock" android:layout_width="40dip" android:layout_height="40dip" android:layout_marginLeft="10dip" android:scaleType="fitXY" android:src="@drawable/lock" android:contentDescription="@string/hello_world"/> </LinearLayout>
package com.xiaobin.security.ui; import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.xiaobin.security.R; import com.xiaobin.security.domain.AppInfo; import com.xiaobin.security.engine.AppInfoProvider; public class AppLockActivity extends Activity { private ListView lv_app_lock; private AppLockAdapter adapter; private List<AppInfo> list; private AppInfoProvider provider; @SuppressLint("HandlerLeak") private Handler handler = new Handler() { public void handleMessage(Message msg) { adapter = new AppLockAdapter(); lv_app_lock.setAdapter(adapter); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.app_lock); lv_app_lock = (ListView) findViewById(R.id.lv_app_lock); provider = new AppInfoProvider(this); initAppInfos(); } private void initAppInfos() { new Thread() { @Override public void run() { list = provider.getAllApps(); handler.sendEmptyMessage(0); } }.start(); } //=========================================================================== private class AppLockAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { AppInfo info = list.get(position); if(convertView == null) { View view = View.inflate(AppLockActivity.this, R.layout.app_lock_item, null); AppManagerViews views = new AppManagerViews(); views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_lock_icon); views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_lock_name); views.iv_app_icon.setImageDrawable(info.getIcon()); views.tv_app_name.setText(info.getAppName()); view.setTag(views); return view; } else { AppManagerViews views = (AppManagerViews) convertView.getTag(); views.iv_app_icon.setImageDrawable(info.getIcon()); views.tv_app_name.setText(info.getAppName()); return convertView; } } } //用来优化listview的类 private class AppManagerViews { ImageView iv_app_icon; TextView tv_app_name; } }
上面的一些都是界面的东西,也很简单的了,但我们写完这些后,还要在高级工具里面增加一个item来进去到程序锁这个界面啦,所以我们还在高级工具里面增加一个点击的条目的,但是之前已经写过很多这些啦,也比较简单,所有大家就自己写一下啦
好啦,今天就先到这里啦,今天主要就是界面的东西,明天我们就会讲那个程序锁的逻辑的了
最后,和大家说一下
为了方便大家的交流,我创建了一个群,这样子大家有什么疑问也可以在群上交流
群号是298440981
今天源码下载