Androidラジオブロードキャスト学習

18967 ワード


Android Broadcastラジオ
 
プロセス内ローカルブロードキャスト
アプリケーション内でブロードキャストを使用している場合は、プロセスをまたがる必要はありません.LocalBroadcastManagerを使用することを考慮してください. ,これにより、プロセス間通信を必要としないため、他のアプリケーションがブロードキャストに関連するセキュリティの問題を送信または受信できることを考慮する必要はありません.
 
より一般的な方法をご紹介します.
 
ブロードキャストの2つの登録方法
ブロードキャストには、静的および動的の2つの登録方法があります.
静的登録:AndroidManifest.xmlにを追加 タブをクリックします.
動的登録:  Context.registerReceiver()メソッドで登録します.たとえばonResumeに登録し、onPauseでログアウトします.
 
例を添付します(例のレイアウト、MyReceiverクラス、定数クラスはすべて同じで、前に列挙します):
レイアウトファイルは同じです.
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".DemoBroadcastActivity" >

    <TextView
        android:id="@+id/helloText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/sendBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/helloText"
        android:text="@string/send" />

RelativeLayout>
 
 
自分で書いたReceiverクラス:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver
{

    
    public MyReceiver()
    {
        super();
        Log.d(AppConstants.LOG_TAG, "Receiver constructor");
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d(AppConstants.LOG_TAG, "onReceive");
        String message = intent.getStringExtra(AppConstants.MSG_KEY);
        Log.i(AppConstants.LOG_TAG, message);
        Toast.makeText(context, "Received! msg: " + message, Toast.LENGTH_SHORT).show();
    }
    
    

}
定数の適用:
public class AppConstants
{
    public static final String LOG_TAG = "Broadcast";
    public static final String MSG_KEY = "msg";
    
    public static final String BROADCAST_ACTION ="com.example.demobroadcast.BroadcastAction";

}
 
次は違う部分です!
 
静的登録のインスタンスコード:
静的登録はmanifestファイルで行います.
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.demobroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.demobroadcast.DemoBroadcastActivity"
            android:label="@string/app_name" >
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

        <receiver
            android:name="com.example.demobroadcast.MyReceiver">
            <intent-filter  >
                <action android:name="com.example.demobroadcast.BroadcastAction" />
            intent-filter>
        receiver>
    application>

manifest>
 
だからJavaコード:
package com.example.demobroadcast;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;

public class DemoBroadcastActivity extends Activity
{
    private Button sendBtn = null;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo_broadcast);

        sendBtn = (Button) findViewById(R.id.sendBtn);

        sendBtn.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setAction(AppConstants.BROADCAST_ACTION);
                intent.putExtra("msg", "   wind");
                sendBroadcast(intent);

            }
        });
    }

}
 
 
動的に登録されたインスタンスコード:
動的登録はJavaコードで行います.
 
package com.example.demobroadcast2;

import com.example.demobroadcast.R;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;

public class DemoBroadcastActivity extends Activity
{
    private Button sendBtn = null;
    
    private MyReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo_broadcast);

        sendBtn = (Button) findViewById(R.id.sendBtn);

        sendBtn.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setAction(AppConstants.BROADCAST_ACTION);
                intent.putExtra("msg", "   wind");
                sendBroadcast(intent);

            }
        });
    }
    
    @Override
    protected void onResume()
    {
        super.onResume();
        
        mReceiver = new MyReceiver();
        IntentFilter intentFilter= new IntentFilter(AppConstants.BROADCAST_ACTION);
        registerReceiver(mReceiver, intentFilter);
    }
    
    @Override
    protected void onPause()
    {
        super.onPause();
        
        unregisterReceiver(mReceiver);
    }
    
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
    }

}
 
したがって、Manifestファイルにラベルを追加する必要はありません.正常に行えばいいです.
 
 
2種類の放送.
  Normal broadcasts
に合格  Context.sendBroadcast送信、完全に非同期(asynchronous).すべての受信機は不確定な順序で動作し、通常は同時である.
これはより効率的であるが、受信機が結果を伝達することができず、ブロードキャストを終了することもできないことを意味する.
  Ordered broadcasts
に合格  Context.sendOrderedBroadcast送信.一度に1つの受信機にのみ送信されます.
各受信機は、順番に実行されるため、結果を次の受信機に伝えることもできるし、ブロードキャストを終了して他の受信機に渡さないこともできる.
受信機の動作順序は、  android:priority プロパティを制御すると、同じ優先度の受信機がランダムな順序で実行されます.
 
受信機のライフサイクル
BroadcastReceiverのオブジェクトは  onReceive(Context, Intent)が呼び出された期間は有効であり、この方法から戻ると、システムはこのオブジェクトが終了し、アクティブではないと考えられる.
これはonReceiveで何ができるかに大きな影響を与えます.必要な操作はできません(anything that requires asynchronous operation is not available).
メソッドから非同期操作に戻る必要があるため、戻るとBroadcastReceiverのオブジェクトはアクティブになりません.システムは(非同期操作が完了する前に)任意にプロセスを殺すことができます.
特に、BroadcastReceiverにダイアログを表示したり、サービスをバインドしたりすることはできません.前者は  NotificationManager、後者はContext.startService()を使用する必要があります.
 
参考資料
公式ドキュメントBroadcastReceiver:
  http://developer.android.com/reference/android/content/BroadcastReceiver.html
  LocalBroadcastManager:
  http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html 
  Training: Manipulating Broadcast Receivers On Demand
  http://developer.android.com/training/monitoring-device-state/manifest-receivers.html
receiverラベル
  http://developer.android.com/guide/topics/manifest/receiver-element.html