我正在研究鎖屏應用程序。 當鎖屏活動正在運行時,長按HOME鍵或按RecentApps鍵將調出RecentApps屏幕,屏幕鎖定將被繞過。那麼我該如何避免這種情況發生? 任何幫助,將不勝感激。如何使活動不被RecentApps覆蓋?
編輯: 感謝您的所有答案。我的問題中一定有一些不清楚的地方。我希望HOME導航欄上的長按或RecentApps鍵不能在我的活動正在運行時工作。
我正在研究鎖屏應用程序。 當鎖屏活動正在運行時,長按HOME鍵或按RecentApps鍵將調出RecentApps屏幕,屏幕鎖定將被繞過。那麼我該如何避免這種情況發生? 任何幫助,將不勝感激。如何使活動不被RecentApps覆蓋?
編輯: 感謝您的所有答案。我的問題中一定有一些不清楚的地方。我希望HOME導航欄上的長按或RecentApps鍵不能在我的活動正在運行時工作。
使用excludeFromRecents
爲您的活動:
<activity android:name="com.package.MyActivity"
android:label="@string/app_name"
android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
編輯:
爲了不顯示最近應用程序對話,而你的應用程序正在運行試試這個:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(!hasFocus) {
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
sendBroadcast(closeDialog);
}
}
希望它有幫助。
添加此功能,並調用它從您的MainActivity
的onCreate
:
private void setAsLockScreen() {
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG | WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
此外,您必須添加:
android:excludeFromRecents="true"
你的清單,以避免顯示有應用。這實際上不是必需的,但很好。
注意:如果您想使用多個活動,當活動更改時,您的默認鎖定屏幕將顯示很短的時間。我在這裏發佈了一個解決方案:Android lock screen multiple activities (a.k.a basic kiosk mode)
編輯:有關此方法的一些其他說明。如果你沒有實現任何功能讓你的應用在這種模式下被鎖定:)。在這種情況下,您必須遠程卸載應用程序。
如果您還將<category android:name="android.intent.category.LAUNCHER" />
添加到您的活動並將其設置爲默認啓動程序,它將在啓動後自動啓動,您將無法再點擊主頁或返回。最近的應用程序可以通過刷出其他應用程序來清除。如果沒有其他的應用程序,你不能切換到其它應用程序:)
這裏是我的解決方案:
我用了一個活動,以決定在LockScreenActivity.This設置符號去啓動或LockScreenActivity方法在HOME鍵禁用方面效果很好,但在RecentApps上完全不起作用。
然後我註冊了一個接收器來接收由LockScreenActivity的onPause方法發送的動作。當接收到動作時,重新啓動LockScreenActivity.And,這很好。
LockScreenActivity:
@Override
protected void onPause() {
super.onPause();
Intent i = new Intent("xx.xx.xx.lockscreen.pause");
sendBroadcast(i);
mCheckLockHandler.postDelayed(mCheckRunnable, 500);//Check again
}
private Runnable mCheckRunnable = new Runnable() {
@Override
public void run() {
Intent intent = new Intent("xx.xx.xx.lockscreen.pause");
sendBroadcast(intent);
}
};
接收器:在清單
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction() == "xx.xx.xx.lockscreen.pause") {
if(SettingsProvider.getBoolean(context, "locked", false)) {
Intent i = new Intent(context, LockScreenActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
}
}
}
放置代碼以避免可見在最近用過由Android:excludeFromRecents = 「真」 的活動代碼 –
@RaviKant裏面我覺得OP是隻有當鎖屏顯示最近的應用程序時纔會詢問,而不是屏幕未鎖定時。 OP可以讓我們更清楚嗎? – MarchingHome
非常感謝您的回答。我不想讓我的活動不會顯示在RecentApps中。我試圖在我的活動正在運行時長時間按HOME或RecentApps鍵不工作。 – imooncat