Reputation: 841
I am currently using a custom AlertDialog which has a Theme.Dialog theme in a Activity that requires users to type the current password to proceed.
According to Android - Is It possible to disable the click of home button i have tried most of the methods but it doesn't work.
Activity - onCreate
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(PhysicalTheftDialog.this);
boolean isServerRunning = sp.getBoolean("isServerRunning", false);
if (isServerRunning == false) {
startService(new Intent(PhysicalTheftDialog.this, MyService.class));
}
else {
sp.getBoolean("isServerRunning", true);
}
Service
@Override
public void onCreate() {
/* //Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
player = MediaPlayer.create(this, R.raw.braincandy);
player.setOnPreparedListener(this);
try {
player.prepareAsync();
} catch (Exception e) {
Log.e(TAG, "", e);
}
player.setLooping(true); // Set looping*/
this.context = getApplicationContext();
//Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
boolean isServerRunning = sp.getBoolean("isServerRunning", true);
while (!isServerRunning) {
// THAT CODE: check if activity is on the top
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
// get a list of running processes and iterate through them
ActivityManager activityManager = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE);
// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
// if top activity is not "MyActivity" activity, then launch it
if("nyp.android.project".equals(componentInfo.getClassName()) == false) {
Intent intent = new Intent(MyService.this, PhysicalTheftDialog.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
}, 2000);
boolean serviceStatus = sp.getBoolean("isServerRunning", false);
}
}
Logcat
E/AndroidRuntime( 9799): FATAL EXCEPTION: main
E/AndroidRuntime( 9799): java.lang.RuntimeException: Unable to start service nyp.android.project.MyService@41b29ff0 with Intent { cmp=xxxx }: java.lang.NullPointerException
E/AndroidRuntime( 9799): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2387)
E/AndroidRuntime( 9799): at android.app.ActivityThread.access$1900(ActivityThread.java:127)
E/AndroidRuntime( 9799): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1221)
E/AndroidRuntime( 9799): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 9799): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 9799): at android.app.ActivityThread.main(ActivityThread.java:4511)
E/AndroidRuntime( 9799): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 9799): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 9799): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
E/AndroidRuntime( 9799): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
E/AndroidRuntime( 9799): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 9799): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 9799): at nyp.android.project.MyService.onStart(MyService.java:95)
E/AndroidRuntime( 9799): at android.app.Service.onStartCommand(Service.java:438)
E/AndroidRuntime( 9799): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2370)
E/AndroidRuntime( 9799): ... 10 more
Upvotes: 0
Views: 3029
Reputation: 570
Maybe I'm Late But
This Is The Only Way Possible
First You Have To Detect The Home Is Pressed
See This Answer To Detect It
Make Changes To This Part Of The Above Answer
HomeWatcher homeWatcher=new HomeWatcher(this);
homeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
@Override
public void onHomePressed() {
//So Here The Main Thing Is..
//You Will Have To Figure Out A Condition On When You Do You Want The Home Button Not To Close The Activity
//In The Condition You Have To Restart The Activity
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
});
So This Code Will Disable The Home Button ( Not Exactly But A Sort Of )
I Hope You Understood It And Works Fine ... If Not , Feel Free To Reach Me Out ( Relating any other sort of additional questions on this OR The Explanation For This )
Upvotes: 0
Reputation: 4234
McAfee Wave Secure did it in the following way: they run a background service that checks every couple seconds if your screen is active. If not Service relaunch your activity or bring it to the front (make it active). In onPause you can save input data to reload it when activity restarted.
My example:
// get a list of running processes and iterate through them
ActivityManager activityManager = (ActivityManager)_context
.getSystemService(Activity.ACTIVITY_SERVICE);
// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
// if top activity is not "MyActivity" activity, then launch it
if(componentInfo.getClassName().equals("com.namespace.MyActivity") == false) {
Intent intent = new Intent(context, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
I do "FLAG_ACTIVITY_NEW_TASK" because I`ve been gotten many instances of the same activity. Maybe there is a way just to make it active.
Example "PSEUDO"
{
Activity:
preference isServerRunning = getPreference("isServerRunning");
if (serviceIsRunning == false) {
runService();
}
// othervise, service is running and will do the job
Onclick.UserLogged() {
setPreference("isUserLoged", true);
}
Service:
while (!userIsLogged) {
// THAT CODE: check if activity is on the top
sleepFor2seconds();
userIsLogger = getPreference("isUserLogged");
}
}
Upvotes: 1
Reputation: 2654
Try to override the method onKeyDown of your Activity class where u want to disable HOME button. In this method check if the user has pressed the HOME button.
Upvotes: 0
Reputation: 2049
Try overiding the onPause() method so that the activity will not stop when the home button press calls it
Upvotes: 0