2011-12-19 3 views
1

응용 프로그램 호출자가 누구인지 알 수있는 방법이 있습니까?Android 앱을 호출/시작/중지하는 사람은 누구입니까?

다음은 몇 가지 사용 사례 사례 :

  • 나는 응용 프로그램과의 위젯이있다. 응용 프로그램이 실행되고 있지 않습니다. 위젯을 추가/제거하면 시스템에서 응용 프로그램을 호출하여 실행합니다 (Application.onCreate() 등). 그래서 이것은 응용 프로그램을 실행하기 위해 아이콘을 누르는 사용자가 아니라 위젯을 업데이트해야한다는 것을 알아야합니다.
  • 메모리가 부족하면 시스템에서 응용 프로그램을 종료 한 다음 메모리가 충분 해지면 다시 복원합니다. 질문은 위와 같습니다.
  • 더 비슷한 경우 ...

내가 관리 할 수있는 유일한 경우는 BroadcastReceiver에서 연장되는 BootUpReceiver이다. 이 경우에만 응용 프로그램이 "시작시 시작"기능에 의해 실행됩니다.

누가 내 응용 프로그램을 호출하는지 (서비스, 수신자, 의도 등)에 대해 확실히 알아야합니다.

호출자 소스 또는 발신자 ID 또는 서비스 또는 내 응용 프로그램을 실행하는 다른 사람에 대한 정보를 알 수있는 방법이 있습니까?

+0

질문의 의미를 다시 말해주십시오. –

+0

정확하게 이해하고 있습니까? 응용 프로그램을 실행할 가능성이있는 시나리오가 있고 런타임에 실행을 시작한 이벤트를 알고 싶습니다. 너의 어플리케이션? – appas

+0

네, 정말 맞습니다. –

답변

2

으로 @CommonsWare 이미 언급 한 :

더 나은 대답은 코드가 실행되는 이유를 상관하지 않는 응용 프로그램은 재 설계하는 것입니다.

그러나 실제로 응용 프로그램이 의 메시지 쿼리를 덤핑에 의해 호출 된 이유에 대한 일반적인 아이디어를 얻을 수 있습니다. 당신은이 작업을 수행하는 코드를 사용할 수 있습니다 :

public static void dumpMainLooper(Context context) { 
    Looper looper = context.getMainLooper(); 
    try { 
     looper.dump(new Printer() { 
      @Override 
      public void println(String s) { 
       Log.d(LOG_TAG, "- " + s); 
      } 
     }, "AppMainLooperDump"); 
    } catch (Throwable th) { 
     Log.d(LOG_TAG, "App Main Looper error", th); 
    } 
} 

당신은 사용하여 응용 프로그램에있는 "논리"에 대한이 코드,하지만 당신은 디버깅 및/또는 로깅에 사용할 수는 일반적인 생각을하지 않도록한다 약 Intent 시스템에서 앱으로 전송하여 앱을 시작합니다.당신은 가능한 한 빨리이 메소드를 호출해야하며, 로그에서 당신은 다음과 같이 표시됩니다

Looper{41ff0388} 
mRun=true 
mThread=Thread[main,5,main] 
[email protected] 
    Message 0: { what=100 when=-438ms obj=ActivityRecord{41ff43e0 [email protected] {com.your.package/com.your.package.MainActivity}} } 
    Message 1: { what=132 when=+9s911ms } 
(Total messages: 2) 

메시지 N이 -이 앱에 시스템에 의해 전송 된 메시지입니다. 여기에는 중요한 메시지가 표시되며이 메시지는 앱 발신자에 대한 일반적인 아이디어를 제공합니다.

1

필자는 누가 (어떤 서비스, 왜, 등) 응용 프로그램을 호출하는지 알 필요가 있습니다.

왜? 시나리오에 대한 정교한 설명이 있지만 칭의는 없습니다.

호출자 소스, 또는 발신자 ID 또는 서비스 또는 내 응용 프로그램 실행 부르는 다른에 대한 정보를 알 수있는 방법이 있습니까?

아니요. 기본 예외는 클라이언트에 바인드 된 서비스가 있고 클라이언트가 바인더에서 메소드를 호출하면 바인더는 호출 한 프로세스의 UID를 찾을 수 있습니다. 또한 발신자가 특정 권한을 보유하고 있는지 여부를 알 수 있습니다.

하지만 더 좋은 대답은 코드를 실행하는 이유에 상관없이 응용 프로그램을 다시 디자인하는 것입니다.

+1

"왜? 시나리오에 대한 정교한 설명이 있지만 칭의는 없습니다." - 예,이 경우 (및 일부 다른 경우) 시작시 몇 가지 체크 포인트가 있지만 올바른 방법이라고 생각하지 않습니다. 나는 응용 프로그램이 예기치 않은 경우 (예 : 업데이트 위젯 또는 다른 Android와 같은) 예상치 못한 경우에 의해 실행되는 것을 원하지 않습니다. 이러한 경우 응용 프로그램이 네트워크에 연결되기 시작하고 예기치 않은 logis를 수행하기 때문입니다. –

관련 문제