안드로이드

[안드로이드] 다른 앱으로 브로드캐스트 리시버 명시적 호출 및 정지 된앱 깨우기

IT꿈나무 2021. 9. 29. 13:17
반응형

* 브로드 캐스트 명시적 호출 및 정지된 앱 깨우기

앱간 통신의 하나의 방법으로 broadcast를 이용하여 앱간의 정보를 주고 받을수 있다.

브로트 캐스트를 이용한 앱간 호출은 developer.android.com을 통해서 확인 해 볼수 있다.

수신 측에서 리시버를 메니페스트에 등록하고, 사용자의 액션명을 등록하고, android:exported="true" 을 이용하여 외부의 앱에서 호출 할수 있도록 등록하면 된다.

 

한가지 문제점은, 호출 부에서 명시적으로 호출 했음에도 앱이 처음 설치되거나, 죽어 있으면 브로드캐스트를 받을수 없는 현상이 있다. 이럴땐. 송신 부에서 intent.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES); 의 옵션을 추가하여 종료된 앱을 깨울수 있다.

 

* 코드 구현

[수신부]

1. manifest.xml

<receiver android:name=".MyBroadcastReceiver"  android:exported="true"> //외부앱 호출 허용
   	<intent-filter>
    	<action android:name="android.intent.action.MY_CUSTOM_ACTION"/>  // 커스텀 액션명
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
   		<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
	</intent-filter>
</receiver>

2. MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
            private static final String TAG = "MyBroadcastReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                StringBuilder sb = new StringBuilder();
                sb.append("Action: " + intent.getAction() + "\n");
                sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
                String log = sb.toString();
                Log.d(TAG, log);
                Toast.makeText(context, log, Toast.LENGTH_LONG).show();
            }
        }

[송신부]

1. 명시적 브로드 캐스트 호출 및 죽은앱 실행.

Intent().also { intent ->
    intent.setAction("android.intent.action.MY_CUSTOM_ACTION")
    intent.putExtra("data", "Notice MSG!")
    //intent.setPackage("com.jky.example.mybroadcastrecevapp")
    //명시적 호출 
    intent.setComponent(ComponentName("com.jky.example.mybroadcastrecevapp", "com.jky.example.mybroadcastrecevapp.MyBroadcastReceiver"));
    //intent.setComponent(ComponentName([앱 ID 패키지명], [브로드 캐스트 패키지명]));
    intent.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES); //!! 죽은 앱을 호출 
    sendBroadcast(intent)

 

* 참고 자료:

[브로드 캐스트 리시버 ] developer.android.com/guide/components/broadcasts?hl=ko

반응형