1

一定時間後に画面がアイドル状態になったときにアクティビティを開始する必要があります。私は、Intent.SCREEN_OFFインテントを検索してオーバーライドするカスタムbroadcastReceiverを作成するのが最善の方法を確立しました。

このカスタムbroadcastReceiver内で、アクティビティを開始しています。初めて画面が消えたときに機能しますが、アプリをアンインストールして再インストールするまでは機能しません。

次のエラーが発生します。

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>

それは別のアクティビティからうまく機能します。さらに、マニフェストが間違っていた場合、終止符は機能しません。

トッドが示唆しているように、「エラーは、アクティビティが何と呼ばれるべきかを見失ったように聞こえます。」これはどのように可能ですか?バグですか?

したがって、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){}
}

別のアクティビティからアクティビティを正常に呼び出すことができます。このサービスから問題なく呼び出すこともできますが、エラーが発生する前に一度だけ呼び出すことができます。

助けていただければ幸いです!

4

2 に答える 2

0

インテントと、おそらくアクティビティのインテントフィルタを変更して、KioskPlayer.classではなくフィルタを使用してアクティビティを呼び出すようにしてください。私はしばらく前に同様の問題を抱えていました。詳細は覚えていませんが、インテントの範囲に関するものであることは間違いありません。クラスアプローチはアプリの「内部」です。フィルタを使用すると、アプリの外部で何かを呼び出すことができます。そして放送受信機は後者を必要とするかもしれません。

于 2012-10-15T12:57:19.217 に答える
0

クラスコンポーネントを無効にしていたためであることが判明しました。つまり、アプリ自体でしか起動できませんでした。

これは確かにトッドの質問に答えます:「エラーは、アクティビティが何と呼ばれるべきかを見失ったように聞こえます。」プログラムで無効にしていたため、システムで検出できなくなりました。

于 2012-10-22T14:47:19.090 に答える