广播发送者 接收者
广播接收者
广播接收者简单地说就是接收广播意图的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是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。
在网上找的可以设置优先级代码:
清单文件里编写
- <receiver android:name=“.Receiver”>
- <intent-filter android:priority=“1000”> <!– 设置最高优先级 –>
- <action android:name=“com.xiazdong”/>
- </intent-filter>
- </receiver>
Java 代码
intentFilter = new IntentFilter(); intentFilter.addAction("com.dzz.android20_sender.955"); //Integer.MAX_VALUE intentFilter.setPriority(998);
</div>