我需要在屏幕空闲一段时间后启动活动。我已经建立了最好的方法是创建一个自定义的broadcastReceiver,它寻找Intent.SCREEN_OFF意图并覆盖它。
在这个自定义broadcastReceiver中,我正在启动Activity。它在屏幕第一次关闭时工作,但在卸载并重新安装应用程序之前它不再起作用。
我收到以下错误:
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>
它适用于另一个Activity。此外,如果清单是错误的,那么它就不会完全停止。
正如托德所暗示的那样,“这个错误让它看起来像是以某种方式失去了应该调用Activity的内容。”这怎么可能?这是一个错误吗?
所以,这是broadcastReceiver代码:
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。我甚至可以从这个服务中调用它,但只有在它出现错误之前一次和一次。
非常感谢帮助!
答案 0 :(得分:0)
尝试更改您的意图,或许可以使用活动的intent过滤器来使用过滤器而不是KioskPlayer.class来调用活动。我刚才有类似的问题;不记得细节,但很确定它是关于Intent的范围:类方法是你的应用程序的“内部”;过滤器允许您调用应用程序外的内容。广播接收者可能需要后者。
答案 1 :(得分:0)
原来是因为我禁用了类组件,这意味着它只能由应用程序本身启动。
这肯定回答了托德的问题:“这个错误让它听起来像是以某种方式失去了应该调用Activity的内容。”我以编程方式禁用了它,因此系统无法再找到它。