如何在任何活动中禁用虚拟主页按钮?
我需要在我的应用程序的任何活动中禁用3个虚拟按钮。不知何故,我禁用了后退按钮和多任务按钮,但我无法设置主页按钮。如何在任何活动中禁用虚拟主页按钮?
我试过onAttachedToWindow()
样式的答案在*但他们没有为我工作。
我不想禁用整个应用程序的主页按钮,我只是想在一个活动窗口中禁用它。感谢您的帮助!
注意:我强烈建议您不要在您的应用中执行此操作,如果您要部署它。这只是为了展示我们如何做到这一点。
由于Android 4没有有效的方法来禁用主页按钮,它需要一点破解。我认为你的需求是在应用程序中的KIOSK模式。总的来说,这个想法是检测一个新应用程序何时处于前台,并立即重新启动您的应用程序Activity
。该工艺如下..
首先创建一个名为KioskService
类,它扩展Service
并添加以下代码片段:
public class KioskService extends Service {
private static final long INTERVAL = TimeUnit.SECONDS.toMillis(2); // periodic interval to check in seconds -> 2 seconds
private static final String TAG = KioskService.class.getSimpleName();
private static final String PREF_KIOSK_MODE = "pref_kiosk_mode";
private Thread t = null;
private Context ctx = null;
private boolean running = false;
@Override
public void onDestroy() {
Log.i(TAG, "Stopping service 'KioskService'");
running =false;
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Starting service 'KioskService'");
running = true;
ctx = this;
// start a thread that periodically checks if your app is in the foreground
t = new Thread(new Runnable() {
@Override
public void run() {
do {
handleKioskMode();
try {
Thread.sleep(INTERVAL);
} catch (InterruptedException e) {
Log.i(TAG, "Thread interrupted: 'KioskService'");
}
}while(running);
stopSelf();
}
});
t.start();
return Service.START_NOT_STICKY;
}
private void handleKioskMode() {
// is Kiosk Mode active?
if(isKioskModeActive()) {
// is App in background?
if(isInBackground()) {
restoreApp(); // restore!
}
}
}
private boolean isInBackground() {
ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
return (!ctx.getApplicationContext().getPackageName().equals(componentInfo.getPackageName()));
}
private void restoreApp() {
// Restart activity
Intent i = new Intent(ctx, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(i);
}
public boolean isKioskModeActive(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_KIOSK_MODE, false);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
添加以下方法在AppContext
类通过应用程序上下文创建开始service
。
@Override
public void onCreate() {
super.onCreate();
instance = this;
registerKioskModeScreenOffReceiver();
startKioskService(); // add this
}
private void startKioskService() { // ... and this method
startService(new Intent(this, KioskService.class));
}
您AppContext
类看起来像这样
public class AppContext extends Application {
private AppContext instance;
private PowerManager.WakeLock wakeLock;
private OnScreenOffReceiver onScreenOffReceiver;
@Override
public void onCreate() {
super.onCreate();
instance = this;
registerKioskModeScreenOffReceiver();
}
private void registerKioskModeScreenOffReceiver() {
// register screen off receiver
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
onScreenOffReceiver = new OnScreenOffReceiver();
registerReceiver(onScreenOffReceiver, filter);
}
public PowerManager.WakeLock getWakeLock() {
if(wakeLock == null) {
// lazy loading: first call, create wakeLock via PowerManager.
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeup");
}
return wakeLock;
}
}
添加服务宣言和检索前台进程清单的权限:
<service android:name=".KioskService" android:exported="false"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
//Added permission Edit 1
<uses-permission android:name="android.permission.WAKE_LOCK" />
我已经看到了这一切在一个网站,但忘记了链接,无论我有什么只是内容和代码,所以我张贴全部作为答案。一旦我获得链接,我会与你分享。
如果我没有错,那么你想禁用home按钮,或者你可以说你的活动保持在每个活动屏幕的前面。
为此,我建议你用窗口管理器屏幕开始你的活动窗口。当您使用窗口管理器开始您的活动时,您的主页按钮活动将变为背景。这意味着您的活动无法通过点击主页按钮关闭。
因此,简单地将您的活动用作窗口管理器活动。许多锁屏应用程序也工作在这种方式
抱歉代码。我不能发布代码,因为我离开了android编程,现在我正在使用动画,所以你可能必须为此努力工作。
但是,您可以通过窗口管理器活动来击败主页按钮和所有其他系统按钮。
我有我的不完整的锁屏应用程序项目。您必须进行一些更改并删除不需要的java类文件和适配器文件。
此外,我在屏幕上开发了81个图像的新锁。两个解锁手机,你必须设置你选择的图像。
您可以从here下载我的不完整项目。
我更新链接并知道它的作品。
你在哪里定义了registerKioskModeScreenOffReceiver()? – kagkar
@kagkar我找到了你正在寻找的链接..你需要或你离开它吗? –
@ShreeKrishna你可以给链接? –