Android-广播BroadcastReceiver-自定义广播接受者和发送者

广播发送者 接收者

广播接收者 

广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写:

public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据;

广播意图就是通过Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)发送的意图,通过这个语句,能够广播给所有满足条件的组件。


广播发送者

通常广播发送方就是调用Context.sendBroadcast()的程序,而广播接收者就是继承BroadcastReceiver的程序;

通常广播发送方都是通过隐式意图,这样才能发送给多人;


 

广播实例无序的(接受者1是:静态广播       接受者2是:动态广播 

态广播:在清单文件中配置

动态广播:使用Java 代码

优先级:态大于静态  


发送者

[java]

package com.dzz.android20_sender;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et_main;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main = (EditText) findViewById(R.id.et_main);

        intent = new Intent();
        //设置广播的名字(设置Action)
        intent.setAction("com.dzz.android20_sender.955");

    }

    public void send(View view){
        String content=et_main.getText().toString();

        //携带数据
        intent.putExtra("data",content);
        //发送广播(无序广播)
        sendBroadcast(intent);
 //发送有序广播          //设置为null 就相当于所有的广播都可以收到
 sendOrderedBroadcast(intent,);
}} [XML]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    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"
    android:orientation="vertical"
    tools:context="com.dzz.android20_sender.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入广播内容"
        android:id="@+id/et_main"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送"
        android:onClick="send"
        />

</LinearLayout>


接受者1:(静态广播)

[java]

这个activity 新建一个

package com.dzz.android20_received01;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * Created by 朝花偏不夕拾 on 2017/2/7.
 */

public class MyReceived01 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if("com.dzz.android20_sender.955".equals(intent.getAction())){
            String daa=intent.getStringExtra("data");
            Log.i("test","01号接收了"+daa);
        }
    }
}

在清单文件中配置

[XML]

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dzz.android20_received01">

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <!--配置广播接受者:
        1:在清单文件中配置(静态广播)
        2:使用Java 代码(动态广播)
        -->
        <receiver android:name=".MyReceived01">
            <intent-filter>
                <action android:name="com.dzz.android20_sender.955"></action>  
            </intent-filter>
        </receiver>
---以上------------------------------------------------------------------


    </application>

</manifest>

接受者2:(动态广播)

[java]


这个activity 新建一个

package com.dzz.android20_received02;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * Created by 朝花偏不夕拾 on 2017/2/7.
 */

public class MyReceived02 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if("com.dzz.android20_sender.955".equals(intent.getAction())){
            String daa=intent.getStringExtra("data");
            Log.i("test","02号接收了"+daa);
        }
    }
}

在Java文件中配置

[java]

package com.dzz.android20_recrived02;

import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private MyReceived02 myReceived02;
    private IntentFilter intentFilter;

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

        myReceived02 = new MyReceived02();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.dzz.android20_sender.955");
    }

    @Override
    protected void onResume() {
        super.onResume();
        //动态注册广播
        registerReceiver(myReceived02,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销动态广播
        unregisterReceiver(myReceived02);
    }
}

test 效果:




02号 就是动态广播   所以动态优先于静态

01号 就是静态广播


onReceive方法必须在10秒内完成,如果没有完成,则抛“Application No Response”当广播接收者onReceive方法需要执行很长时间时,最好将此耗时工作通过Intent发送给Service由Service完成,并且不能使用子线程解决,因为BroadcastReceiver是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。


在网上找的可以设置优先级代码:


清单文件里编写

  1. <receiver android:name=“.Receiver”>  
  2.       <intent-filter android:priority=“1000”> <!– 设置最高优先级 –>  
  3.          <action android:name=“com.xiazdong”/>  
  4.       </intent-filter>  
  5.  </receiver> 

Java 代码

   intentFilter = new IntentFilter();
 intentFilter.addAction("com.dzz.android20_sender.955");
    //Integer.MAX_VALUE
 intentFilter.setPriority(998);







            </div>

猜你喜欢

转载自blog.csdn.net/yzj_0722/article/details/80329013