Java 从后台服务启动Android活动

Java 从后台服务启动Android活动,java,android,service,android-activity,screensaver,Java,Android,Service,Android Activity,Screensaver,我需要在屏幕空闲一段时间后启动一项活动。我已经确定了最好的方法是创建一个定制的broadcastReceiver,它查找Intent.SCREEN_OFF Intent并覆盖它 在这个定制的广播接收器中,我开始活动。它在屏幕第一次关闭时工作,但在卸载并重新安装应用程序之前不会再次工作 我得到以下错误: android.content.ActivityNotFoundException:找不到显式活动类{/};您是否在AndroidManifest.xml中声明了此活动 回答这个相当明显的问题,是

我需要在屏幕空闲一段时间后启动一项活动。我已经确定了最好的方法是创建一个定制的broadcastReceiver,它查找Intent.SCREEN_OFF Intent并覆盖它

在这个定制的广播接收器中,我开始活动。它在屏幕第一次关闭时工作,但在卸载并重新安装应用程序之前不会再次工作

我得到以下错误:

android.content.ActivityNotFoundException:找不到显式活动类{/};您是否在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>
我可以从另一个活动中调用该活动。我甚至可以从这个服务中调用它,但只有在它出现错误之前才能调用它


非常感谢您的帮助

尝试更改您的意图,或者更改活动的意图筛选器,以便使用筛选器而不是KioskPlayer.class调用活动。不久前我也有类似的问题;不记得细节了,但可以肯定是关于意图的范围:类方法是应用程序的“内部”方法;该过滤器允许您调用应用程序外部的内容。而广播接收器可能需要后者。

原来是因为我禁用了类组件,这意味着它只能由应用程序本身启动


这当然回答了Todd的问题:“这个错误让它听起来好像不知何故失去了对应该调用什么活动的跟踪。”我已经通过编程禁用了它,因此系统无法再找到它。

而且您确信您在Manifest.xml中声明了该活动吗?非常严重。我从另一个活动中调用该活动,该活动运行良好。当屏幕第一次关闭时,它也可以正常工作。在那之后,它只是给出了一个错误。这个错误使它听起来好像不知怎么地失去了对活动应该被调用的跟踪。即使我不怀疑你在你的清单中声明了它,也许发布它也会有一些价值,以防万一它是一些相关的错误。我已经更新了问题以显示清单声明。
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){}
}