簡體   English   中英

從后台服務啟動Android Activity

[英]Starting an Android Activity from a background Service

我需要在屏幕閑置一段時間后開始活動。 我已經建立了最好的方法是創建一個自定義的broadcastReceiver,它查找Intent.SCREEN_OFF intent並將其覆蓋。

在此自定義的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正常工作。 此外,如果清單是錯誤的,那么它將不能完全停止。

正如Todd所建議的那樣,“錯誤使它聽起來好像以某種方式失去了對應該調用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){}
}

我可以從另一個活動中調用活動。 我什至可以從此Service調用它,但只能在它收到該錯誤之前調用它一次。

幫助將不勝感激!

嘗試更改您的意圖,並可能更改活動的意圖過濾器,以使用過濾器而不是KioskPlayer.class來調用該活動。 我前段時間也遇到過類似的問題。 不記得詳細信息,但是可以確定它與Intent的范圍有關:類方法是應用程序的“內部”; 過濾器使您可以在應用程序外部調用內容。 廣播接收者可能需要后者。

原來是因為我禁用了類組件,這意味着它只能由應用程序本身啟動。

這無疑回答了托德的問題:“錯誤使我們聽起來似乎迷失了應該調用Activity的位置。” 我已經以編程方式禁用了它,因此系統不再能夠找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM