정적 리시버
동적 리시버
FLAG_EXCLUDE_STOPPED_PACKAGES
FLAG_INCLUDE_STOPPED_PACKAGES
FLAG_RECEIVER_REGISTERD_ONLY
FLAG_RECEIVER_REPLACE_PENDING
리시버에서도 액티비티와 마찬가지로 작업시간이 제한되어있다. (메인스레드에서 동작하므로)
백그라운드 리시버 : 60초
포그라운드 리시버: 10초
1. TestReceiver.java 클래스 작성
public class TestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("리시버알림","라이트 온");
Toast.makeText(context, "Light On !!", Toast.LENGTH_SHORT).show();
}
}
//-----------------------------------------------------------------------------
2. 메니페스트에 TestReceiver 등록
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application>
...
<receiver android:name=".TestReceiver">
<intent-filter> <!--오래오 이전버전에서는 이렇게 해야됨-->
<action android:name="com.test.action.TEST"/>
<action android:name="android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>
</application>
</manifest>
//-----------------------------------------------------------------------------
3. 액티비티에서 호출
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("test.com.action.TEST");
sendBroadcast(intent);
}
동작설명
위의 3번의 액티비티 화면의 앱을 켜면 방송(Broadcast)을 특정액션(test.com.action.TEST)으로 한다.
메니페스트에 등록한 정적리시버가 test.com.action.TEST의 액션을 포함하고 있으므로 4-1에서 방송을 리시버가 캐치해서 실행한다.
Light On !! 이란 토스트팝업이 뜬다.
또한 2번의 메니페스트에 android.intent.action.SCREEN_ON 액션도 설정했으므로 휴대폰 화면을 껐다 켜도 이 리시버가 동작한다.
동적리시버는 메니페스트에 리시버를 등록해놓지 않는다.
1. 동적리시버 생성 및 등록
BroadcastReceiver receiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 인텐트 필터 설정
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("test.com.action.TEST");
// 동적리시버 생성
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Light On !!", Toast.LENGTH_SHORT).show();
}
};
// 위에서 설정한 인텐트필터+리시버정보로 리시버 등록
registerReceiver(receiver, intentFilter);
}
//-----------------------------------------------------------------------------
2. 동적으로 등록한 리시버 호출
Intent intent = new Intent();
intent.setAction("test.com.action.TEST");
sendBroadcast(intent);
동작은 정적리시버 예제와 동일하게 동작한다.