在打开应用程序之前为锁屏服务

时间:2014-08-29 06:40:45

标签: java android android-service alarmmanager android-pendingintent

我正在尝试创建一个应用程序,其中有一个锁定/密码屏幕,然后打开所选应用程序以保护您的应用程序。

市场上有一些如:

https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en

这是GitHub上的一个开源软件。 https://github.com/twinone/AppLocker

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

基本上我想要实现他们所做的相同的事情,但是目前我没有用我编写的服务类实现这一点。我可以锁定应用程序,但当应用程序被杀时我不能。我花了很多时间学习待定意图,报警管理器,广播接收器,甚至学习示例源代码

https://github.com/twinone/AppLocker/blob/master/src/com/twinone/locker/lock/AppLockService.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();
    }

}

现在我可以锁定应用程序,但是当应用程序被杀或手机重新启动时我不能。当所有应用程序被强制停止或手机重新启动,ram清除等时,Google Play商店中的应用锁定应用仍然可以成功锁定带有PIN码的应用。

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分: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  ));

}

别忘了为boot_completion操作添加权限。

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>