Android 찰진 브로드캐스트 StickyBroadcast 사용

Android 브로드캐스트의 분류:
1. 일반 방송: 이런 방송은 순서대로 각 프로세서에 전달하여 처리할 수 있다.
2. 질서정연한 방송: 이런 방송은 프로세서 쪽에서 처리되는 순서는 프로세서의 서로 다른 우선순위에 따라 구분된다. 높은 우선순위의 프로세서는 이 메시지를 우선적으로 캡처하고 삭제할 수 있다.
3. 점성 메시지: 점성 메시지는 발송된 후에 시스템의 메시지 용기에 계속 존재하고 대응하는 프로세서가 처리하기를 기다린다. 만약에 프로세서가 이 메시지를 처리하지 않으면 메시지 용기 안에서 계속 대기 상태에 있다. 점성 방송의 Receiver가 소각되면 다음 재건 시 자동으로 메시지 데이터를 받을 것이다.
주의: 일반 방송은 점성 소식과 달리 캡처되고 질서정연한 방송은 캡처될 수 있습니다.
안드로이드 시스템의 점성 방송은 일반적으로 중요한 상태가 바뀐 후의 정보를 지속적으로 보존하고 새로운 방송 수신기에 수시로 방송할 수 있다. 예를 들어 전원의 변화, 전기 소모는 하나의 과정이 필요하기 때문에 앞의 과정은 반드시 미리 받아야 한다. 그렇지 않으면 다음에 마침 수신한 방송이 끝난 후에 시스템이 자동으로 꺼질 수 있다. 이에 따라kill 행위가 발생한다.그래서 일부 미처리 임무에 대해 말하자면 결과는 매우 심각하다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
점성 방송을 보내는 데는 권한이 필요합니다. (이 권한은 정보를 저장하는 권한과 시스템이 처리하지 않은 방송을 보내는 권한입니다.)

점성 방송의 발송은 일반 방송의 발송 방식과 일치한다.스티커 브로드캐스트의 올바른 사용 방식을 테스트하기 위해서는 Stick Broadcast를 보낼 SenderActivity를 정의해야 합니다.
public class SenderActivity{

@Override
protected void onCreate(Bundle saveInstance) {
    super.onCreate(saveInstance);
    setContentView(R.layout.stcik_test_layout);
    getWindow().setBackgroundDrawableResource(R.drawable.avatar11);
}

@Override
protected void onResume() {
    super.onResume();
getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
        public void run() {
     sendStickyBroadcast();
      }
    }, 3*1000);
}

private void sendStickyBroadcast()
{
    Intent i = new Intent();
    i.setAction(StickyBroadcastReceiver.Action);
    i.putExtra("info", "sticky broadcast has been receiver");
    sendStickyBroadcast(i);
    Log.i("Other","sticky broadcast send ok!");
}

}

알아야 할 것은 점성방송은 일반방송의 일종이기 때문에 일반방송 수신기로 수신할 수도 있다. 물론 점성방송은 또 다른 자주 사용하는 수신 방식이 있다.
1. 일반 방송 수신기를 사용하려면 반드시 Manifiest나 발송 전에 수신해야 한다(이것은 정의와 약간 어긋난다. 왜냐하면 이런 방식은 정확한 수신 방식이 아니기 때문이다)
public class StickyBroadcastReceiver extends BroadcastReceiver {

    public static final String Action = "com.sample.test.sticky.broadcast.receiver";
    public static final String PERMISSION = "com.sample.test.permission.sticky.receiver";
    @Override
    public void onReceive(Context context, Intent intent)
    {
        int checkCallingOrSelfPermission = context.checkCallingOrSelfPermission(PERMISSION);
        if(PackageManager.PERMISSION_GRANTED == checkCallingOrSelfPermission) //    
        {
            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
            throw new RuntimeException("permission denied");
        }
        if(intent!=null&&Action.equals(intent.getAction()))
        {
            Toast.makeText(context, intent.getStringExtra("info"), Toast.LENGTH_SHORT).show();
        }
    }

}

Mainifest.xml










    
    
         
    

2. 올바른 방식으로 접수(추천)
정확한 수신 방식은 BroadcastReceiver를 사용하지 않아도 받을 수 있습니다
SenderActivity의 onResume를 조금만 수정하면 됩니다.
@Override
protected void onResume() {
    super.onResume();
//3    
 getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
        public void run()
         {
         sendStickyBroadcast();
      }
    }, 3*1000);

//15    
getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
    public void run()
    {
        IntentFilter intentFilter = new IntentFilter(StickyBroadcastReceiver.Action);
        Intent data = registerReceiver(null, intentFilter);
        if(data!=null&&StickyBroadcastReceiver.Action.equals(data.getAction()))
        {
            Toast.makeText(this, data.getStringExtra("info"), Toast.LENGTH_SHORT).show();
        }
    }
    }, 15*1000);
}

이러한 10초 정도의 시간대[먼저 발송, 후 수신]는 점성방송이 정보를 완전히 보존하고 있음을 설명한다. 우리가 다음과 같은 방식을 사용하면 얻을 수 있고 무한히 얻을 수 있다.
 Intent data = registerReceiver(null, intentFilter); //  ,      ,         

부주: 이런 방송도 제거할 수 있습니다. 우리는 방송을 받은 후에removeStickyBroadcast(intent)를 호출할 수 있습니다.
다음으로 이동:http://www.codeweblog.com/android-%E7%B2%98%E6%80%A7%E5%B9%BF%E6%92%ADstickybroadcast%E7%9A%84%E4%BD%BF%E7%94%A8/

좋은 웹페이지 즐겨찾기