2016-01-29 98 views
1

我正在創建鬧鐘應用程序,因此我想使用AlarmManager在特定時間運行我的應用程序。它應該打開屏幕並禁用任何鍵盤鎖。Android AlarmManager在前臺應用程序中打開屏幕

一切工作正常,如果應用程序已關閉或在後臺。 AlarmMager呼叫我的BroadcastReceiver,在那裏我可以開始我的活動。屏幕繼續,我看到我的應用程序。

問題是如果我的應用程序已經在屏幕關閉的前臺。我可以聽到我的應用程序的聲音,所以我知道警報已解除,但屏幕無法打開。

我試過玩任務和窗口設置,但沒有成功。 Intent.FLAG_ACTIVITY_NEW_TASK,

這個問題也可能與我並不是在onCreate方法中的所有窗口屬性有關。我只是想打開屏幕,如果應用程序也決定有一個報警事件,並觸發onCreate後startWakeup。

AndroidManifest.xml中

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <application ...> 
    <activity 
      android:name=".FullscreenActivity" 
      android:configChanges="orientation|keyboardHidden|screenSize" 
      android:label="@string/app_name" 
      android:theme="@style/Theme.AppCompat.NoActionBar" 
      android:launchMode="singleTask"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:process=":remote" android:name=".AlarmMan"></receiver> 
     <receiver android:name=".AutoStart"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
     ... 
     </activity> 
    </application> 

AlarmMan.java

public class AlarmMan extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive (Context context, Intent intent) 
    { 
     Intent i = new Intent(context, FullscreenActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 

FullscreenActivity.java

public class FullscreenActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
     WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
     WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    } 

    public void startWakeup() { 
runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
       mainFrame.setSystemUiVisibility(
         View.SYSTEM_UI_FLAG_LOW_PROFILE | 
           View.SYSTEM_UI_FLAG_FULLSCREEN | 
           View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
           View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 
           View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 
           View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       ); 
       } 
       }); 
       } 

       public void stopWakeup() { 
       runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

       mainFrame.setSystemUiVisibility(
         View.SYSTEM_UI_FLAG_VISIBLE 
         ); 
       } 
     }); 
    } 

回答

0
onReceive()方法

第一件事,可以獲取wake lock

不要忘記發佈它。

+0

是的,我發現一個喚醒鎖解決了這個問題。但據我瞭解,wakelocks已被棄用,應該由WindowManager.LayoutParams替換。因此我認爲Android 5.0中存在一個錯誤。我在德國看到類似的帖子:https://www.androidpit.de/forum/625157/window-flags-werden-nur-1x-beruecksichtigt – Alex

+0

我不認爲有一個錯誤,因爲我猜onCreated()在你的情況下,您的清單中不會調用launchMode的原因。試着看onNewIntent()。 –

+0

另外我不認爲wakelocks實際上是「depricated」,開發文檔說你應該仔細使用它,並且對於大多數情況下窗口標誌是足夠的 –

相關問題