Android9.0 程序锁实现

本文介绍了如何在Android 9.0上实现程序锁功能。通过启动时检查栈顶Activity并与加密数据库对比,如果发现是加密程序则弹出密码输入界面。为保持服务后台运行,利用了Android 8.0后的startForegroundService并播放无声音乐避免ANR。内容包括布局设计、适配器代码、MainActivity中应用匹配逻辑以及服务中处理输入密码后的行为。提供了一个实现示例的下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体思路:当启动一个程序时获取栈顶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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值