java - 从后台服务启动 Android Activity

标签 java android service android-activity screensaver

我需要在屏幕闲置一段时间后启动一项 Activity 。我已经确定最好的方法是创建一个自定义广播接收器,它查找 Intent.SCREEN_OFF Intent 并覆盖它。

在这个自定义的广播接收器中,我正在启动 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>

它可以在另一个 Activity 中正常工作。此外,如果 list 错误,那么它就无法完全停止。

正如 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){}
}

我可以从另一个 Activity 调用该 Activity 。我什至可以从该服务调用它,但只能在出现该错误之前调用一次。

非常感谢您的帮助!

最佳答案

尝试更改您的 Intent ,也许还有 Activity 的 Intent 过滤器,以使用过滤器而不是 KioskPlayer.class 来调用 Activity 。不久前我也遇到过类似的问题;不记得细节,但很确定它与 Intent 的范围有关:类方法是您的应用程序的“内部”;该过滤器允许您调用应用程序外部的内容。广播接收器可能需要后者。

关于java - 从后台服务启动 Android Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894277/

相关文章:

mysql - 无法在 WAMP 中启动 MySQL 服务器

java - .tailSet 据说返回 NavigableSet,但似乎返回 TreeSet

Android ViewBinding 错误 : Cannot access class 'android.widget.no_name_in_PSI_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40'

android - 如何在支持双卡双待的手机中选择主卡来发送短信?

javascript - Phonegap 2.0.0 keyup 事件

Android 如何在不同线程中运行服务

rest - Azure 部署版本

java - Java 中的 TCP 客户端和 C 中的服务器

java - 创建 keystore 时出错 => 线程 "main"java.io.DataInputStream.readInt 处的 java.io.EOFException 异常(未知来源)

Java对象: Method doesn't print as it should