2011-04-19 114 views
99

對於我的Android應用程序,我從不希望手機鎖定或背光燈關閉如何將屏幕保持在我的應用程序中?

+11

有在這個崗位更好的解決方案做到這一點: 的http://計算器。 com/questions/4807634/disable-keep-screen-on – Derzu 2012-02-25 05:01:20

+0

http://stackoverflow.com/a/16015358/1318946 – 2013-09-11 13:32:05

回答

89

使用PowerManager.WakeLock類序執行此。 請看下面的代碼:

import android.os.PowerManager; 

public class MyActivity extends Activity { 

    protected PowerManager.WakeLock mWakeLock; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(final Bundle icicle) { 
     setContentView(R.layout.main); 

     /* This code together with the one in onDestroy() 
     * will make the screen be always on until this Activity gets destroyed. */ 
     final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 
     this.mWakeLock.acquire(); 
    } 

    @Override 
    public void onDestroy() { 
     this.mWakeLock.release(); 
     super.onDestroy(); 
    } 
} 

使用清單文件的follwing權限:

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

希望這將解決您的問題... :)

+25

不應該在'onResuem'和'onPause'這樣的應用程序不會保持屏幕當用戶點擊主頁按鈕? – 2011-09-23 03:29:50

+0

PowerManager pm是否必須聲明爲final? – 2012-10-31 00:53:22

+0

對於@SethHikari提出的問題不太好的建議。太多的工作,消耗太多的CPU功耗。 – Ewoks 2013-06-19 13:18:18

5

您需要使用Power Manager才能在應用程序中獲取喚醒鎖。

最可能的是你有興趣在一個FULL_WAKE_LOCK

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
wl.acquire(); 
.... 
wl.release(); 
14

看一看這個討論Force Screen On

hackbod有一個很好的答案。

+2

同意。請不要使用喚醒鎖。漂亮請! – Grimmace 2012-10-08 15:31:14

186

添加的setContentView()中的onCreate(後)一行代碼

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_flag); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 
+3

這個答案是每個活動,如果你不想讓應用程序喚醒CPU,因爲你沒有正確管理喚醒鎖,那麼這個答案會更好。 – Ewoks 2013-06-19 13:19:08

+1

那麼你如何關閉這個標誌呢? – 2013-12-29 13:03:22

+21

@kilaka用'getWindow()。clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)''關閉它。 – anthonycr 2014-01-04 00:48:21

15
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

getWindow是活動定義的方法,而不會要求你找到一個View第一。

+0

與@ hackbod的解決方案相同:http://stackoverflow.com/a/2134602/435605 – 2013-12-29 13:16:18

+0

謝謝@kilaka :) – 2013-12-30 05:13:54

102

很多答案已經存在!我正在用附加的和可靠的解決方案回答這個問題:

使用PowerManager.WakeLock不是一個可靠的解決方案,因爲該應用程序需要額外的權限。

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

此外,如果它意外地保持喚醒鎖,它可以離開屏幕。

因此,我建議不要使用PowerManager.WakeLock解決方案。取而代之的是,使用任何以下解決方案:

第一:

我們可以在onCreate()

@Override 
     protected void onCreate(Bundle icicle) { 
      super.onCreate(icicle);  
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     } 

第二次使用getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

我們可以使用keepScreenOn

1。實施Java代碼使用setKeepScreenOn()

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     View v = getLayoutInflater().inflate(R.layout.driver_home, null);// or any View (incase generated programmatically) 
     v.setKeepScreenOn(true); 
     setContentView(v); 
     } 

文檔http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2.添加keepScreenOn到XML佈局

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:keepScreenOn="true" > 

http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn文檔

註釋(一些有用的點S):

  1. 這不要緊,keepScreenOn應該在主/根/父視圖中使用。它可以與任何子視圖一起使用,並且將以與父視圖相同的方式工作。
  2. 唯一重要的是視圖的可見性必須可見。否則,它不會工作!
+1

是的,它應該是正確的答案!我正在尋找一個實施「keepScreeOn」(我認爲這是實現這個目標的最佳方法)的例子,這是唯一能夠很好地展示它的答案! – 2014-01-23 19:29:51

+0

不需要該權限。 – mhdjazmati 2017-01-11 14:10:53

+0

v.setKeepScreenOn(true);精彩的M sdk手機上的作品,沒有檢查Ls的' – CodeToLife 2017-02-12 16:05:56

38

請勿使用喚醒鎖。

It requires permission and other stuff and may cause error if you forget to set it in right time. 

最簡單的方法是,當你要保持你的屏幕上使用下面的代碼..

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

任一方式,如果你想刪除或終止keep_Screen_on

答案
getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

你還可以看到here ..

the best and easiest way ..在活動的佈局根目錄中使用android:keepScreenOn="true"可以在沒有額外代碼的情況下執行相同的操作。但是,它仍將它Keep_Scree_on國..

它可以在你的需求See here

+0

工程很棒。我還清除了onStop中的標誌,因此屏幕上的狀態在我的應用程序外部像往常一樣運行。出於某種奇怪的原因,它似乎沒有這樣做,但似乎是正確的方式來做它無論如何,以確保我會離開它(也​​許它不同於其他手機比我的Nexus 5)。 – riper 2015-01-06 14:39:26

7

在你想保留在屏幕上是最好的選擇活動(一個或多個)的XML添加android:keepScreenOn="true"被改變。將該行添加到活動的主佈局。

像這樣的事情

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true" 
    android:orientation="vertical" 
    tools:context="${relativePackage}.${activityClass}" > 

... 

</LinearLayout> 
+0

適合我,thx。 – 2015-12-03 18:51:22

1

此時方法

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 
     this.mWakeLock.acquire(); 

已被棄用。

您應該使用 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

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

必須有,如果你想將其設置爲

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

我測試過了,但是權限不是必需的。 – 2015-06-19 07:44:09

+0

你是完全正確的,我的錯誤忘記清理/重建項目,同時測試... – Proxytype 2015-06-19 21:22:01

0

無需添加權限和做花樣。只需在主佈局中使用以下文本即可。

android:keepScreenOn="true" 
2

嘗試這個我們可以做到多種方式在那些

解決方法1:

 class MainActivity extends AppCompactActivity{ 
         @Override 
           protected void onCreate(Bundle icicle) { 
            super.onCreate(icicle);  
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
           } 
         } 

溶液2:

在activity_main.xml中文件

只需添加

<android:KeepScreenOn="true"/> 

我的建議是請不要使用WakeLock,如果你使用這個,你將會定義額外的許可 ,而且這個東西大多在cpu的開發環境中很有用。

,並確保在關閉活動

關閉屏幕,您可以通過這種方式

pubic void onDestry(){ 
    getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    } 
+1

有這樣的建議/答案已經存在 – user7294900 2017-07-23 06:39:28

相關問題