2012-10-15 199 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来调用活动。我前一段时间遇到类似问题;不记得细节,但很确定它是关于意图的范围:类的方法是你的应用程序的“内部”;该过滤器允许您在应用程序外部调用内容。广播接收机可能需要后者。