방송 수신기를 프로그래밍 방식으로 등록하는 가장 좋은 방법 / 방법이 무엇인지 알고 싶습니다. 사용자 선택에 따라 특정 수신기를 등록하고 싶습니다.
등록은 매니페스트 파일을 통해 수행되므로 코드에서이를 달성하는 적절한 방법이 있는지 궁금합니다.
방송 수신기를 프로그래밍 방식으로 등록하는 가장 좋은 방법 / 방법이 무엇인지 알고 싶습니다. 사용자 선택에 따라 특정 수신기를 등록하고 싶습니다.
등록은 매니페스트 파일을 통해 수행되므로 코드에서이를 달성하는 적절한 방법이 있는지 궁금합니다.
답변:
매니페스트에 게시 된 구성 요소가 활성 상태인지 여부를 제어하려는 것 같습니다 (실행 중 Context.registerReceiver ()를 통해) 수신기를 동적으로 등록하지 마십시오.
그렇다면 PackageManager.setComponentEnabledSetting ()을 사용하여 이러한 구성 요소의 활성화 여부를 제어 할 수 있습니다.
실행 중 브로드 캐스트 수신에만 관심이있는 경우 registerReceiver ()를 사용하는 것이 좋습니다. 수신기 구성 요소는 주로 브로드 캐스트가 전송 될 때마다 앱을 시작해야하는 경우에 유용합니다.
당신에 onCreate
방법이 같은 수신기를 등록 할 수 있습니다 :
private BroadcastReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState){
// your oncreate code should be
IntentFilter filter = new IntentFilter();
filter.addAction("SOME_ACTION");
filter.addAction("SOME_OTHER_ACTION");
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//do something based on the intent's action
}
};
registerReceiver(receiver, filter);
}
onDestroy
메소드 에서 이것을 실행해야합니다 .
@Override
protected void onDestroy() {
if (receiver != null) {
unregisterReceiver(receiver);
receiver = null;
}
super.onDestroy();
}
onDestroy()
호출이 보장되지 않아 잠재적 인 메모리 누수가 발생할 수 있습니다. 그것은 / 등록 취소에 등록하는 것이 좋습니다 onStart()
/ onStop()
.
사람들이 언급하는 것을 잊어 버린 한 가지 중요한 점은의 수명입니다 Broadcast Receiver
. 프로그래밍 방식으로 AndroidManifest.xml에 등록하는 것과 차이점 이 있습니다. 매니페스트 파일에서는 응용 프로그램 수명에 의존하지 않습니다. 프로그래밍 방식으로 등록 할 때는 응용 프로그램 수명에 따라 다릅니다. 이는 AndroidManifest.xml에 등록 하면 애플리케이션이 실행 중이 아닌 경우에도 브로드 캐스트 된 의도를 포착 할 수 있음을 의미합니다 .
편집 : 언급 한 메모는 Android 3.1부터 더 이상 사실이 아니며, Android 시스템은 사용자가 해당 응용 프로그램을 시작한 적이 없거나 사용자가 Android 메뉴를 통해 응용 프로그램을 명시 적으로 중지 한 경우 기본적으로 모든 수신자가 의도를 수신하지 못하도록합니다 관리 → 응용 프로그램). https://developer.android.com/about/versions/android-3.1.html
이것은 사용자가 시작한 응용 프로그램 만 브로드 캐스트 인 텐트를받을 수 있다는 것을 확신 할 수있는 추가 보안 기능입니다.
따라서 응용 프로그램에 프로그래밍 방식으로 등록 된 수신기 onCreate()
는 위의 Android 3.1 에서 AndroidManifest.xml에 선언 된 수신기 와 동일한 효과를 갖습니다 .
다음과 같이 Activity / Fragment의 어느 곳에 나 브로드 캐스트 리시버를 정의하십시오.
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG," onRecieve"); //do something with intent
}
};
에 IntentFilter 정의 onCreate()
mIntentFilter=new IntentFilter("action_name");
이제 브로드 캐스트 onResume()
리시버를 등록하고 onPause()
[활동이 일시 중지 된 경우 브로드 캐스트를 사용하지 않기 때문에] 에서 등록을 취소하십시오 .
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, mIntentFilter);
}
@Override
protected void onPause() {
if(mReceiver != null) {
unregisterReceiver(mReceiver);
mReceiver = null;
}
super.onPause();
}
자세한 자습서를 보려면 브로드 캐스트 리시버 두 가지 구현 방법을 살펴보십시오 .
package com.example.broadcastreceiver;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* This method enables the Broadcast receiver for
* "android.intent.action.TIME_TICK" intent. This intent get
* broadcasted every minute.
*
* @param view
*/
public void registerBroadcastReceiver(View view) {
this.registerReceiver(broadCastReceiver, new IntentFilter(
"android.intent.action.TIME_TICK"));
Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT)
.show();
}
/**
* This method disables the Broadcast receiver
*
* @param view
*/
public void unregisterBroadcastReceiver(View view) {
this.unregisterReceiver(broadCastReceiver);
Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT)
.show();
}
}
글로벌 메시지 수신 및 브로드 캐스트 및 일반적인 작업 에서 알람 설정 및 Android에서 알람을 수행 하는 방법에 따르면 :
수신 클래스가 매니페스트에서 사용하여 등록되지 않은 경우 Context.registerReceiver () 를 호출하여 수신자를 동적으로 인스턴스화하고 등록 할 수 있습니다. .
자세한 내용 은 registerReceiver (BroadcastReceiver 수신기, IntentFilter 필터) 를 참조하십시오.
context.registerReceiver
걸리지 않을 수 있습니다.이 질문을보십시오. stackoverflow.com/questions/13238600/…
대한 LocalBroadcastManager
Intent intent = new Intent("any.action.string");
LocalBroadcastManager.getInstance(context).
sendBroadcast(intent);
등록 onResume
LocalBroadcastManager.getInstance(
ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter);
등록을 취소하십시오 onStop
LocalBroadcastManager.getInstance(
ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver);
그리고 그것을받을 ..
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("mBroadcastReceiver", "onReceive");
}
};
IntentFilter는
new IntentFilter("any.action.string")
1) 활동이 표시 될 때만 브로드 캐스트를 읽으려면
registerReceiver(...
)에서 onStart()
와 unregisterReceiver(...)
에서onStop()
2) 활동이 백그라운드에 있어도 브로드 캐스트를 읽으려면
registerReceiver(...)
안으로 onCreate(...)
그리고 unregisterReceiver(...)
안으로onDestroy()
당신이 게으른 경우
각 활동에서 BroadcastReceiver를 반복적으로 등록 및 등록 취소하기위한 상용구 코드를 작성하지 않으려면,
다음은 코드 스 니펫입니다.
추상 활동
public abstract class BasicActivity extends AppCompatActivity {
private BroadcastReceiver broadcastReceiver;
private IntentFilter filter;
private static final String TAG = "BasicActivity";
/**********************************************************************
* Boilerplate code
**********************************************************************/
@Override
public void onCreate(Bundle sis){
super.onCreate(sis);
broadcastReceiver = getBroadcastReceiver();
filter = getFilter();
}
@Override
public void onStart(){
super.onStart();
register();
}
@Override
public void onStop(){
super.onStop();
unregister();
}
private void register(){
registerReceiver(broadcastReceiver,filter);
}
private void unregister(){
unregisterReceiver(broadcastReceiver);
}
/**********************************************************************
* Abstract methods
**********************************************************************/
public abstract BroadcastReceiver getBroadcastReceiver();
public abstract IntentFilter getFilter();
}
이 방법을 사용하면 일반적인 애니메이션 작성, 서비스 바인딩 등과 같은 더 많은 상용구 코드를 작성할 수 있습니다.
방송 수신기 만들기
[BroadcastReceiver (활성화 = true, 내보내기 = false)]
public class BCReceiver : BroadcastReceiver
{
BCReceiver receiver;
public override void OnReceive(Context context, Intent intent)
{
//Do something here
}
}
활동에서 다음 코드를 추가하십시오.
LocalBroadcastManager.getInstance(ApplicationContext)
.registerReceiver(receiver, filter);