整体思路:当启动一个程序时获取栈顶activity,与加密数据库配对,若是加密程序,调用startactivity启动一个输入密码的界面,密码正确,进入应用。可以看出实现改功能需要脱离activity,那就想到了开启一个后台服务,而Android8.0之后只能用startforegroudserver开启,并在服务开启5秒内调用startforegroud方法,不然要报ANR。理想是美好的,模拟器里行得通,真机里死活不行。于是,想了个损招,在后台放一个无声音乐来保活。
首先是布局,两个按钮,一个显示加锁列表,一个未加锁列表。两个recycleview 一个隐藏一个显示。
代码如下:
对应适配器代码如下:
<?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:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/bt_unlock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未加锁"
android:textColor="#fff"
android:textSize="18sp"/>
<Button
android:id="@+id/bt_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已加锁"
android:textColor="#fff"
android:textSize="18sp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_unlock"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_unlock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="未加锁应用"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/unlockrv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_lock"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/tv_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已加锁应用"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</LinearLayout>
public class AppInfoAdapter extends RecyclerView.Adapter<AppInfoAdapter.LockViewHolder> implements View.OnClickListener {
private OnItemClickListener onItemClickListener;
private Context mContext;
private Boolean isLock;
private ArrayList<AppInfo> mLockList;
public AppInfoAdapter(Context context, ArrayList<AppInfo> lockList,boolean isLock){
this.isLock = isLock;
this.mContext = context;
this.mLockList = lockList;
}
public void setOnItemClickListener(OnItemClickListener l){
this.onItemClickListener=l;
}
@Override
public LockViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.listview_islock_item, viewGroup, false);
view.setOnClickListener(this);
return new LockViewHolder(view);
}
public interface OnItemClickListener{
void onItemClick(View view, int position, AppInfo appInfo);
}
@Override
public void onBindViewHolder(@NonNull LockViewHolder lockViewHolder, int i) {
AppInfo appInfo = mLockList.get(i);
lockViewHolder.itemView.setTag(i);
lockViewHolder.iv_icon.setImageDrawable(appInfo.getIcon());
lockViewHolder.tv_name.setText(appInfo.getAppname());
if(isLock){
lockViewHolder.iv_lock.setImageResource(R.drawable.lock);
}else{
lockViewHolder.iv_lock.setImageResource(R.drawable.unlock);
}
}
@Override
public int getItemCount() {
return mLockList.size();
}
@Override
public void onClick(View v) {
if(onItemClickListener!=null){
int position = (int)v.getTag();
AppInfo appInfo = mLockList.get(position);
onItemClickListener.onItemClick(v