2

중지 응용 프로그램에서 방송을 수신합니다. 브로드 캐스트 인 텐트에 플래그 FLAG_INCLUDE_STOPPED_PACKAGES을 추가하면이를 수신하는 방법이 있습니다.는 <strong>의 상태</strong>을 (아직 한 번도 실행되지 않음) 중지 응용 프로그램이 <strong>방송</strong>를받을 수없는, 기본적으로

내 문제는 시스템 의도가 android.intent.action.MEDIA_MOUNTED (그리고 그 플래그를 추가하고 싶지 않다)받을 필요가 있다는 것입니다.

정지 된 응용 프로그램에서도 어떻게받을 수 있습니까?

예를 들어 com.android.shell 응용 프로그램이 강제 중지 되더라도 이러한 의도를 수신 할 수 있기 때문에 가능하다고 확신합니다. 어떻게 그럴 수 있습니까?


편집 :이 명확하지 않다 것으로 나타났다 때문에

그냥, 명확히하기 : 여기

모든 안드로이드 오픈 소스 프로젝트 개발자의 관점에서입니다. 운영체제 소스 코드를 수정하고 있습니다. 방송 수신을 원하는 응용 프로그램은 미리 설치하거나 플랫폼 인증서로 서명하거나 숨겨진 API를 사용할 수 있습니다. 시스템의 수정도 가능합니다.

+2

"내 문제는 내가 android.intent.action.MEDIA_MOUNTED 시스템의 의도를 받아야한다는 것입니다. (그리고 그 플래그를 추가하고 싶지 않습니다.)"- 원하는 경우에도 플래그를 추가 할 수 없습니다. 당신이 '의도'를 방송하지 않는 한. "중단 된 신청서에서도 어떻게받을 수 있습니까?" - 일반 SDK 앱에서는이 작업을 수행 할 수 없습니다. 시스템 애플리케이션이 적어도 사전 설치된 것들을 처리 할 수 ​​있다고 생각할 수 있습니다. 그리고 물론, 안드로이드의 수정 된 버전을 가진 주문 ROM은 이것을 제안 할 수 있었다. – CommonsWare

+0

@CommonsWare : 편집 된 질문을 참조하십시오. 내 앱은 일반 SDK 앱이 아니므로 시스템을 수정할 수 있습니다. 문제는 그것을 편리한 방법으로하는 것입니다. – damgad

+0

아, 네, 상황이 크게 바뀝니다. 나는 당신을 도울 수 없으며 전체 Stack Overflow는 일반 SDK 응용 프로그램을 지원하는 데 더 많은 자원을 사용하는 경향이 있습니다. 가능한 해결책은 앱의 강제 중지를 사용 중지하는 것입니다. 시스템 애플 리케이션의 무리가 그렇게, 나는 거기에 다른 시스템 애플 리케이션을 그런 식으로 구성하는 방법이 있다고 가정합니다. 그런 다음 사용자는 먼저 앱을 정지 상태로 이동시킬 방법이 없어야합니다. – CommonsWare

답변

3

응용 프로그램을 시스템 응용 프로그램으로 선언하면 응용 프로그램이 "중지됨 상태"인 경우에도 일반 방송을 수신 할 수 있습니다. 당신이 뿌리 장치에있는 경우

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
... 
... 
android:sharedUserId="android.uid.system"> 
+0

android : sharedUserId = "android.uid.system"이 없으면 어떻게됩니까? – JohnyTex

+0

내 응용 프로그램은 플랫폼 서명으로 서명해야합니까, 아니면/system/priv-app에 넣을 수 있습니까? – JohnyTex

+1

Android 4.4에서/system/priv-app APK는 플랫폼 키로 서명되지 않은 경우에도 시스템 권한을 갖습니다. 자세한 정보 : http://stackoverflow.com/a/20104400/6587754 –

0

당신은 android.content.Intent # isExcludingStopped을 수정 Xposed를 사용할 수 있습니다

는 매니페스트에 다음을 추가하고 응용 프로그램이 플랫폼 키로 서명되어 있는지 확인 같은 :

public class DontExcludeStoppedPackagesFromIntents implements IXposedHookLoadPackage { 
    @Override 
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { 
     if (lpparam.packageName.equals("android")) { 
      XposedBridge.log("In package: " + lpparam.packageName); 

      findAndHookMethod("android.content.Intent", lpparam.classLoader, "isExcludingStopped", new XC_MethodReplacement() { 
       @Override 
       protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { 
        return false; 
       } 
      }); 
     } 
    } 
} 

xposed_init에서 클래스 이름을 넣어하는 것을 잊지 마십시오. 당연히 이것은 안보에 영향을 미쳐 실질적으로 안드로이드 3.0으로 다시 돌아갑니다. 아무도이 문제가 거의없는 기존의 거의 모든 안드로이드 장치에없는 취약점을 악용 할 것으로 예상하지 않기 때문에 문제가되지 않아야합니다. 패치 적용.

나는 위의 그것을 시도하고 작동합니다!