2012-10-15 196 views
1

我需要在特定時間後屏幕閒置時啓動活動。我建立了最好的方法是創建一個自定義的broadcastReceiver,它查找Intent.SCREEN_OFF意圖並覆蓋它。從後臺服務啓動Android活動

在這個自定義的broadcastReceiver裏面,我開始了Activity。它在屏幕第一次熄滅時起作用,但在應用程序卸載並重新安裝之前它不會再運行。

,我發現了以下錯誤:

android.content.ActivityNotFoundException: Unable to find explicit activity class {/}; have you declared this activity in your AndroidManifest.xml?

要回答這個相當明顯的問題,是的。我有。

<activity 
     android:name="gold.KioskPlayer" 
     android:configChanges="orientation|keyboardHidden" 
     android:enabled="true" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.HOME" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

它工作從另一個活動罰款。而且,如果Manifest錯誤,那麼它就不會完全停止。

正如Todd所說,「錯誤使得它聽起來像是不知何故失去了應該調用Activity的軌道。」這怎麼可能?這是一個錯誤嗎?

所以,這裏的廣播接收器代碼:

BroadcastReceiver screenoff = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

     Log.d("ScreenSaver", "ScreenSaver1 - ScreenOff"); 
     //Log.d("Power Lock Pressed", "Power Button Off Pressed:" + intent.getAction()); 
     if(!setup.screensaverShown || !setup.canSleep) 
     { 
      releaseWakeLock(); 
      try { 
       setup.wl = setup.pm.newWakeLock(
          PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 
          "ScreenSaver"); 
       setup.wl.acquire(); 
       Thread.sleep(100); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      try{ 
       KioskPlayer.setup.screensaver=true; 
       Log.d("ScreenSaver", "ScreenSaver1 starting..."); 
       Intent i = new Intent(getBaseContext(), KioskPlayer.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(i); 
      }catch(Exception e) 
      { 
       Log.d("ScreenSaver", "ScreenSaver1 " + e.toString()); 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 


BroadcastReceiver screenon = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(setup.canSleep) 
     { 
      setup.canSleep=false; 
     } 

    } 

}; 


public void releaseWakeLock(){ 
    try { 
     if (setup.wl != null && setup.wl.isHeld()) 
     { 
      setup.wl.release(); 
      setup.wl = null; 
     } 
    }catch(Exception e){} 
} 

我可以從另一個調用活動精細活動。我甚至可以從這個服務中調用它,但是隻有在它發生錯誤之前一次。

幫助將不勝感激!

+0

你確定你在你的Manifest.xml中聲明瞭Activity? – DroidBender

+0

超出。我從另一個Activity中調用了Activity,它工作正常。第一次屏幕熄滅時,它也可以正常工作。之後,它只是給出了錯誤。 – Nico

+0

這個錯誤使得它聽起來像是以某種方式失去了應該被調用的Activity的蹤跡。即使我不懷疑你在清單中聲明瞭它,也許在發佈時也會有一些價值,以防萬一它是一些相關的錯誤。 –

回答

0

原來,這是因爲我禁用了類組件,這意味着它只能由應用程序本身啓動。

這當然回答了託德的問題:「錯誤使得它聽起來像某種程度上失去了活動應該被稱爲的軌道。」我已經以編程方式禁用了它,因此係統無法再找到它。

0

嘗試更改您的意圖,也許活動的意圖過濾器使用過濾器而不是KioskPlayer.class來調用活動。我前一段時間遇到類似問題;不記得細節,但很確定它是關於意圖的範圍:類的方法是你的應用程序的「內部」;該過濾器允許您在應用程序外部調用內容。廣播接收機可能需要後者。