2014-11-14 45 views
1

我正在研究鎖屏應用程序。 當鎖屏活動正在運行時,長按HOME鍵或按RecentApps鍵將調出RecentApps屏幕,屏幕鎖定將被繞過。那麼我該如何避免這種情況發生? 任何幫助,將不勝感激。如何使活動不被RecentApps覆蓋?

編輯: 感謝您的所有答案。我的問題中一定有一些不清楚的地方。我希望HOME導航欄上的長按或RecentApps鍵不能在我的活動正在運行時工作。

+1

放置代碼以避免可見在最近用過由Android:excludeFromRecents = 「真」 的活動代碼 –

+0

@RaviKant裏面我覺得OP是隻有當鎖屏顯示最近的應用程序時纔會詢問,而不是屏幕未鎖定時。 OP可以讓我們更清楚嗎? – MarchingHome

+0

非常感謝您的回答。我不想讓我的活動不會顯示在RecentApps中。我試圖在我的活動正在運行時長時間按HOME或RecentApps鍵不工作。 – imooncat

回答

1

使用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); 
    } 
} 

Reference

希望它有幫助。

+1

正如你在上面評論中提到的那樣,這不是OP詢問的)編輯:O​​ps,我誤以爲你的暱稱是@MarchingHome,對不起 – Mixaz

+0

@Mixaz true。在OP澄清後編輯。感謝您指出:) –

+1

我不知道可以關閉系統對話框,然後投票 – Mixaz

1

添加此功能,並調用它從您的MainActivityonCreate

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" />添加到您的活動並將其設置爲默認啓動程序,它將在啓動後自動啓動,您將無法再點擊主頁或返回。最近的應用程序可以通過刷出其他應用程序來清除。如果沒有其他的應用程序,你不能切換到其它應用程序:)

+0

真的很有趣,我不知道這是可能的。我會繼續關注這篇文章)) – Mixaz

+1

我們正在使用這個爲kiosk模式應用程序。 –

+0

好的,我會稍後嘗試這種方法。謝謝很多!:) – imooncat

0

這裏是我的解決方案:

我用了一個活動,以決定在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); 
     } 
    } 
}