|
1 |
| -# SampleBroadCastingSendData |
2 |
| -App과 App의 비동기 데이터 통신 프로젝트 입니다. |
| 1 | +# App과 App의 비동기 통신 |
3 | 2 |
|
4 |
| -#### 1. What's Project. |
| 3 | +App과 App 사이의 정보를 주고 받을 수 있는 방법은 다양하게 있습니다. `SharedPreferences`, `콘텐트 프로바이더`, `SQLite`, `BroadcastReceiver`,` intent`, 등 여러 방식으로 App 간의 데이터를 주고 받을 수 있습니다. |
5 | 4 |
|
6 |
| - BroadcastRecevier을 활용한 App과 App의 비동기 데이터 통신 프로젝트 입니다. |
7 |
| - |
8 |
| -#### 2. How to create this project. |
| 5 | +이전에는 SharedPreferences 을 활용하여 간단하게 주고 받을 수 있었습니다. |
9 | 6 |
|
10 |
| -[Go to Site](http://faith-developer.tistory.com/entry/APP%EA%B3%BC-APP-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1) |
| 7 | +```java |
| 8 | +// SharedPreferences 을 공용으로 사용할 수 있는 소스코드 |
| 9 | +Context _context = null; |
| 10 | +try { |
| 11 | + _context = createPackageContext("send target application package name", Context.CONTEXT_IGNORE_SECURITY); |
| 12 | +} catch (PackageManager.NameNotFoundException e) { |
| 13 | + e.printStackTrace(); |
| 14 | +} |
| 15 | + |
| 16 | +try { |
| 17 | + if (con != null) { |
| 18 | + SharedPreferences pref = _context.getSharedPreferences( |
| 19 | + "token_id", Context.MODE_WORLD_READABLE); |
| 20 | + |
| 21 | + String data = pref.getString("shared_token", ""); |
| 22 | + Log.d("msg", "Other App Data: " + data); |
| 23 | + } else { |
| 24 | + Log.d("msg", "Other App Data: Context null"); |
| 25 | + } |
| 26 | +} catch (Exception e) { |
| 27 | + e.printStackTrace(); |
| 28 | +} |
| 29 | +``` |
| 30 | + |
| 31 | +이전 버전에서 제공되었던 Context.MODE_WORLD_READABLE 의 사용을 API Level 17 에서 사용중지 하였습니다. |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +위의 Android Developer 사이트에서 명시 되었듯이 ContentProvider, BroadcastRecevier, service 을 사용할 것을 권장하고 있습니다. 따라서 이번 공유 드릴 방식은 BroadcastReceiver 방식으로 App 과 App 비동기 통신 하는 방식을 공유 하겠습니다. |
| 36 | + |
| 37 | +<br/> |
| 38 | + |
| 39 | +# **BroadcastRecevier |
| 40 | + |
| 41 | +BroadcastRecevier 를 사용하여 App과 App 간의 비동기로 데이터를 주고 받는 로직은 다음으로 구성하였습니다. |
| 42 | + |
| 43 | +1. `BroadcastRecevier` 를 Server App(보내는 App), Client App(받는 앱) 두 앱 모두 `Action Name`을 등록합니다. |
| 44 | +2. 등록한 `BroadcastRecevier`에 데이터를 전송합니다. |
| 45 | +3. `BroadcastRecevier`의 onReceive() 발생 시 `SharedPreferences`에 전송받은 데이터를 저장합니다. |
| 46 | + |
| 47 | +<br/> |
| 48 | + |
| 49 | +# **BroadcastRecevier 등록 |
| 50 | + |
| 51 | +BroadcastRecevier 등록하는 방법은 두 가지 입니다. manifests에 등록하는 정적리시버, 등록과 해지가 가능한 동적 리시버 로 나눠집니다. 이번 포스트에서 사용한 BroadcastRecevier는 정적 리시버로 앱이 실행 시 BroadcastRecevier가 등록 되어 비동기 처리 할 수 있도록 구성하였습니다. |
| 52 | + |
| 53 | +사용방법은 minifests에 등록만 하면 됩니다. `<application></application>` 사이에 `<receiver/>` 등록 하여 관리합니다 . 여기서 `<receiver/>`에 등록할 receiver name은 BroadcastReceiver을 상속받은 class을 입력합니다. |
| 54 | + |
| 55 | +또한 **<uses-permission> .RECEIVE_BOOT_COMPLETED </uses-permission>** 을 선언하여 모바일 폰 재부팅 시에도 BroadcastRecevier 등록 상태를 유지 시켜 줍니다. |
| 56 | + |
| 57 | +<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> |
| 58 | + |
| 59 | +```xml |
| 60 | +<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> |
| 61 | + |
| 62 | + <receiver android:name=".TestBroadcastReceiver" > |
| 63 | + <intent-filter> |
| 64 | + <action android:name="kr.co.kcs.packagetestserver.client_one"/> |
| 65 | + <category android:name="android.intent.category.DEFAULT" /> |
| 66 | + </intent-filter> |
| 67 | + </receiver> |
| 68 | + <!-- ... 밑에 부분 생략 --> |
| 69 | +``` |
| 70 | + |
| 71 | +<br/> |
| 72 | + |
| 73 | +# **BroadcastRecevier 데이터를 전송 |
| 74 | + |
| 75 | +데이터 전송부분은 sendBroadcast(Intent)을 사용하여 전송합니다. |
| 76 | + |
| 77 | +```java |
| 78 | +//Broadcast 전송 |
| 79 | +public void sendDateTime(Context ctx, String input) { |
| 80 | + Intent intent = new Intent(TestBroadcastReceiver.BROADCAST_SERVER); |
| 81 | + intent.putExtra(TestBroadcastReceiver.KEY_DATE, input); |
| 82 | + sendBroadcast(intent); |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | +new Intent(String) 에서 String 에 해당하는 값은 BroadcastRecevier로 등록한 action 값을 등록하면 됩니다. |
| 87 | + |
| 88 | +<br/> |
| 89 | + |
| 90 | +# **SharedPreferences 저장** |
| 91 | + |
| 92 | +BroadcastRecevier의 onReceive() 발생 시 SharedPreferences에 전송받은 데이터를 저장하는 로직을 구성할 것입니다. |
| 93 | + |
| 94 | +```java |
| 95 | +public class TestBroadcastReceiver extends BroadcastReceiver { |
| 96 | + private static final String TAG = "TestBroadcastReceiver"; |
| 97 | + public static final String BROADCAST_SERVER = "kr.co.kcs.packagetestserver.server"; |
| 98 | + public static final String BROADCAST_CLIENT0_ONE = "kr.co.kcs.packagetestserver.client_one"; |
| 99 | + public static final String KEY_DATE = "date"; |
| 100 | + |
| 101 | + @Override |
| 102 | + public void onReceive(Context context, Intent intent) { |
| 103 | + String name = intent.getAction(); |
| 104 | + |
| 105 | + if(name.equals(BROADCAST_SERVER)){ |
| 106 | + //SharedPreferences 에 데이터 저장 부분 |
| 107 | + Utils.setDateTime(context, intent.getStringExtra(KEY_DATE)); |
| 108 | + } |
| 109 | + } |
| 110 | +} |
| 111 | +``` |
| 112 | + |
| 113 | +<br/> |
| 114 | + |
| 115 | +# **정리** |
| 116 | + |
| 117 | +공유드린 3 가지 방식인 BroadcastReceiver 등록과 데이터 전송, SharedPreferences에 저장 하는 방식으로 구성 시 App 간 비동기 데이터 전송을 확인할 수 있습니다. 다른 방식인 콘텐트 프로바이더, 서비스 로 구성할 수 있으나 간편하게 사용 할 수 있는 BR 통신을 사용하였습니다. |
0 commit comments