2012-10-15 4 views
1

일정 시간이 지나면 화면이 유휴 상태 일 때 활동을 시작해야한다는 요구 사항이 있습니다. 가장 좋은 방법은 Intent.SCREEN_OFF 인 텐트를 찾아 무시하는 사용자 지정 broadcastReceiver를 만드는 것입니다.배경 서비스에서 Android 활동 시작

이 사용자 정의 broadcastReceiver 안에는 활동이 시작됩니다. 처음 화면이 꺼지면 작동하지만 앱을 제거하고 다시 설치할 때까지는 다시 작동하지 않습니다.

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> 

다른 활동 벌금에서 작동합니다. 또한, Manifest가 잘못 되었다면 완전히 멈추지 않을 것입니다.

토드 (Todd)가 제안한 것처럼 "오류로 인해 어떤 액티비티가 호출 될 예정인지 추적 할 수없는 것처럼 들립니다." 이것이 어떻게 가능한지? 그게 버그 야?

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

내가 다른 활동 미세에서 활동을 호출 할 수 있습니다

그래서, 여기에 브로드 캐스트 리시버 코드입니다. 나는 심지어이 오류 메시지를 받기 전에 한 번 그리고 한 번만이 서비스에서이 코드를 호출 할 수 있습니다.

도움을 주시면 대단히 감사하겠습니다.

+0

그리고 Manifest.xml에서 활동을 선언하셨습니까? – DroidBender

+0

엄청나게. 나는 잘 작동하는 다른 Activity에서 Activity를 호출하고 있습니다. 처음 화면이 꺼지면 잘 작동합니다. 그 후에, 그것은 단지 오류를 제공합니다. – Nico

+0

오류는 어떤 식 으로든 Activity가 호출되어야하는 트랙을 잃는 것처럼 들리게 만듭니다. 비록 당신이 당신의 매니 페스트에서 그것을 선언했다는 것을 의심하지는 않지만, 아마도 그것과 관련하여 약간의 오류가있을 때를 대비하여, 그것을 게시하는 데 어느 정도 가치가있을 것입니다. –

답변

0

클래스 구성 요소를 사용하지 않도록 설정했기 때문에 앱 자체에서만 시작할 수있었습니다.

이것은 확실히 Todd의 질문에 대한 답변입니다. "오류로 인해 Activity가 호출되어야하는 대상을 추적하지 못하는 것처럼 들립니다." 프로그래밍 방식으로 사용 중지 했으므로 더 이상 시스템에서 찾을 수 없습니다.

0

KioskPlayer.class가 아닌 필터를 사용하여 활동을 호출하기 위해 의도 및 어쩌면 활동의 의도 필터를 변경하십시오. 나는 전에 비슷한 문제가 있었다. 세부 사항을 기억하지는 않지만 Intent의 범위에 관한 것이라는 확신이 들었습니다. 클래스 접근법은 앱의 '내부'입니다. 필터를 사용하면 앱 외부에서 물건을 호출 할 수 있습니다. 그리고 방송 수신기에는 후자가 필요할 수 있습니다.