2014-10-20 80 views
3

我是新來android應用程序開發,因此有嚴重的麻煩讓我的應用程序運行成功。我想我的大部分問題都可以歸因於Android平臺概念的缺乏以及Android上PC編程概念的使用! ;)Android背景服務控制UI活動

我打算做的是開發一個基於UI的android應用程序,但我有一個強大的要求,應用程序應該像一個守護進程一樣! 當我說守護進程;當應用程序啓動時,UI應該不可見!基於某些喚醒事件,應用程序顯示將被喚醒,以便用戶可以看到UI。同樣基於特定的睡眠事件,應用程序UI應該被隱藏。類似於android上的鬧鐘應用程序。

UI部分對我來說非常簡單,因爲我使用的是Android的Qt端口,應用程序的工作原理類似於魅力。但是,它的工作方式與任何常規應用程序一樣,並不包括上述要求。我嘗試過查看Qt文檔,並且沒有規定要實現這一點,並且在某些論壇中,他們建議使用android SDK方法來實現此目的。

因爲我不是Java專家,所以我閱讀了很多關於android開發的知識,並設法創建了一個應用程序,它可以滿足上面的要求,但是我沒有幾個問題,我想知道如果我遵循了正確的做法。因此總結我在下面做了什麼。

  1. 我subclassed android.app.Service和在我的覆蓋onStartCommand,我創建工作線程,檢查喚醒和睡眠事件。爲了討論起見,我們假設喚醒事件是每60分鐘一次,睡眠事件就像喚醒後5分鐘一樣。
  2. 在onStartCommand方法,我在廣播一個Intent希望創建我的服務來接收它的活動(以下步驟6中解釋了爲什麼我這樣做)
  3. 上滿足喚醒條件的工作線程,開始我的UI活動如下:

    Intent activityIntent = new Intent(getBaseContext(), MyUIActivity.class); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplication().startActivity(activityIntent);

  4. 上滿足睡眠狀態時的工作線程,請求我的UI活動通過廣播一個Intent期待UI活動接受它來完成。

  5. onStartCommand最終返回START_NOT_STICKY。
  6. 我有一個主要的活動,註冊一個IntentFilter的BroadcastReceiver的實例,從上面的第2步開始服務後,接收Intent。在收到Intent後,我會調用finish()來關閉UI以保存我的服務!

上述設置工作正常,我可以看到服務在適當的Toast消息後臺進行,當喚醒條件滿足並且Qt小部件完美顯示在屏幕上時,UI也顯示出來。 但是,我以安全的方式獲取此設置的幾個問題。下面是這些問題(不知道它們是否是真正的問題):

有時,當我啓動應用程序時,我看不到從onStartCommand方法啓動服務的toast消息,但logcat顯示以下消息:

W/ActivityManager( 628): Scheduling restart of crashed service org.example.myapp/.MyService in 1000ms I/ActivityManager( 628): START u0 {flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity (has extras)} from pid 21764 W/ActivityManager( 628): Permission Denial: starting Intent { flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity (has extras) } from null (pid=21764, uid=2000) not exported from uid 10129

當我嘗試手動啓動該應用程序,它工作正常!當我嘗試通過調用finish()來隱藏UI活動的時候,我認爲這是當我看到以下消息:

I/WindowState( 628): WIN DEATH: Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity} W/ActivityManager( 628): Scheduling restart of crashed service org.example.myapp/.MyService in 1000ms W/WindowManager( 628): Force-removing child win Window{41962f40 u0 SurfaceView} from container Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity}

在此之後,該服務不再有效!

基本上,我的問題是:這是正確的做法嗎?

回答

0

請確認當睡眠事件發生時,您的設備處於睡眠模式,即屏幕關閉還是打開?

如果它已經在睡覺,那麼您的接收器將不會收到意圖,因爲它已經在睡覺。您必須在活動中設置標誌,以便您可以在活動恢復時執行相應操作並完成活動實例。

由於服務的生命週期與活動的生命週期沒有關聯,所以你沒有看到你的吐司消息。服務一直保持在後臺運行,直到您明確停止它們或系統終止它們。

+0

我給出的睡眠事件只是一個例子。但是我可以確認設備始終運行並且未處於鎖定狀態。 我必須補充一點:我的UI應用程序也有要求,無論何時UI運行,屏幕應始終可見(不應該調暗背光或自動鎖定)。因此,在我的主UI活動的onResume重寫方法中,我調用了getWindow()。addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON),並在onPause方法中調用了getWindow()。clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON),以便設備不會休眠。 – asumang 2014-10-20 13:06:04