打开应用前的锁屏服务

问题描述 投票:4回答:1

我正在尝试制作一个应用程序,在你打开选定的应用程序之前有一个锁定密码屏幕,以保护你的应用程序。

有一些在市场上,如。

https:/play.google.comstoreappsdetails?id=com.domobile.applock&hl=en。

这里是GitHub上的一个开源的。https:/github.comtwinoneAppLocker。

我意识到,即使上述应用程序被杀死,或RAM的被清除,或手机重新启动等。锁屏仍然会显示出所选应用。

本质上我想实现和他们一样的事情,但目前我写的服务类还不能实现。我可以锁定应用程序,但当应用程序被杀死时,我不能。我花了大量时间学习待定意图、报警管理器、广播接收器,甚至研究示例源代码

https:/github.comtwinoneAppLockerbmastersrccomtwinonelockerlockAppLockService.java。

但我没有成功实现。

这是我的服务类。

package com.ibc.android.demo.appslist.app;

import android.app.ActivityManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.util.Log;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
public class HeartBeat extends Service {



    private static final String TAG = HeartBeat.class.getSimpleName();
    public Timer TIMER;



    private static Set<AccessGranted> mAccessGrantedList = new HashSet<AccessGranted>();
    private Set<String> mLockedApps = new HashSet<String>();
    private long lastModified = 0;
    private BroadcastReceiver mScreenStateReceiver;
    private BroadcastReceiver mAccessGrantedReceiver;
    private File mLockedAppsFile;
    ArrayList<String> packagezList;
    SharedPreferences sharedPrefs;
    Map<String, ?> allEntries;
    SharedPreferences sharedPrefsapp;

    String prefix;





    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {


        startService(new Intent(this, HeartBeat.class));












        // Log.i("LocalService", "Received start id " + startId + ": " +
        // intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        if (TIMER == null) {

            TIMER = new Timer(true);
            TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);

            mScreenStateReceiver = new BroadcastReceiver() {

                private boolean screenOff;

                @Override
                public void onReceive(Context context, Intent intent) {



                    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                        screenOff = true;
                    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                        screenOff = false;
                    }

                    if (screenOff) {
                        //Log.i(TAG, "Cancel Timer");
                        TIMER.cancel();
                    } else {
                       // Log.i(TAG, "Restart Timer");
                        TIMER = new Timer(true);
                        TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);
                    }
                }
            };

            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            registerReceiver(mScreenStateReceiver, filter);

            mAccessGrantedReceiver = new BroadcastReceiver() {

                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    String packageName = intent.getStringExtra("packageName");
                    if (action.equals(Constants.ACTION_GRANT_ACCESS) && packageName != null) {
                        AccessGranted ag = new AccessGranted(packageName);
                        mAccessGrantedList.remove(ag);
                        mAccessGrantedList.add(ag);
                    }
                }
            };

            IntentFilter filter2 = new IntentFilter(Constants.ACTION_GRANT_ACCESS);
            registerReceiver(mAccessGrantedReceiver, filter2);
        }
        // this.stopSelf();



        //startforeground goes here



        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        startService(new Intent(this, HeartBeat.class));
    }




    private class LockAppsTimerTask extends TimerTask {




        @Override
        public void run() {


            sharedPrefs = getApplicationContext().getSharedPreferences(getApplicationContext().getPackageName(), Context.MODE_PRIVATE);
            sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
            allEntries= null;
             allEntries = sharedPrefsapp.getAll();

            //prefix = "m";
            packagezList= null;


            packagezList = new ArrayList<String>();




            for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
                    //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
                    packagezList.add(entry.getKey());





            }


/*        for (Map.Entry<String, ?> entry : allEntries.entrySet())
        {
            //Check if the package name starts with the prefix.
            if (entry.getKey().startsWith(prefix)) {
                //Add JUST the package name (trim off the prefix).
                packagezList.add(entry.getKey().substring(prefix.length()));
            packagezList.add(entry.getKey());

            }
        }*/

            for(Object object: packagezList){
                Log.e("YO!", (String) object);
            }








            ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);

            try {
                //List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
                ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager
                        .getRunningTasks(1);
                ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
                String activityOnTop = ar.topActivity.getPackageName();

                // Log.e("activity on Top", "" + activityOnTop);
                //   Log.e(" My package name", "" + getApplicationContext().getPackageName());








                //for (Object data : newArrayList) {

                for(Object object: packagezList){

// Provide the packagename(s) of apps here, you want to show password activity
                    if ((activityOnTop.contains((CharSequence) object)) &&
                            (!activityOnTop.contains(getApplicationContext().getPackageName()
                            ))) {  // you have to make this check even better


                        Intent i = new Intent(getApplicationContext(), LockScreenActivity.class);
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                        i.putExtra( "", "");
                        startActivity(i);
                    }

                }


            } catch (Exception e) {
               // Log.e("Foreground App", e.getMessage(), e);
            }
        }



    }

} 

这是我的LockScreen活动类(当所选应用打开时显示的屏幕)。

package com.ibc.android.demo.appslist.app;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;

import com.spicycurryman.getdisciplined10.app.R;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class LockScreenActivity extends Activity {
    private static final String TAG = LockScreenActivity.class.getSimpleName();
    Map<String, ?> allEntries;
    SharedPreferences sharedPrefsapp;
    ArrayList<String> packagezList;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup);

    }
    @Override
    public void onBackPressed() {



        // Grab a list of all running processes and their PIDs.
        ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses();

        // Now loop through the list of PIDs and find Instagram's PID.
        sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
        allEntries= null;
        allEntries = sharedPrefsapp.getAll();

        //prefix = "m";
        packagezList= null;


        packagezList = new ArrayList<String>();




        for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
            //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
            packagezList.add(entry.getKey());
        }


        // Killing any process for blocked applications when the back button is pressed while the lock screen is displayed

        for(Object object: packagezList){
            am.killBackgroundProcesses((String) object);
            Log.d("Killed Background Process!: ", (String) object);


        }



        // Now that we've got the PID, kill the Instagram process.


        // Now that we've got the PID, kill the Instagram process.

        ActivityManager  am1 = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);


        // Display confirmation here, finish() activity.
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);


        startService(new Intent(this, HeartBeat.class));


  /*      Intent iHeartBeatService = new Intent(this, HeartBeat.class);
        PendingIntent piHeartBeatService = PendingIntent.getService(this, 0, iHeartBeatService, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(piHeartBeatService);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 300000, piHeartBeatService);*/

        finish();
        super.onBackPressed();
    }

}

现在,我能够锁定应用程序,但当应用程序被杀死或手机重新启动时,我不能锁定。Google Play Store上的应用锁应用在所有应用被强行停止或手机重启、清除内存等情况下,仍然可以成功地用pin锁定应用。

如何才能实现像那些有?

java android android-service alarmmanager android-pendingintent
1个回答
2
投票

我想你应该尝试这个...

     package com.ankit.vkapplock;

 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;

 public class StartupServiceReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){

        context.startService(new Intent(context, HeartBeat.class  ));

}

不要忘了添加permisson的boot_completion动作。

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
© www.soinside.com 2019 - 2024. All rights reserved.