應用廣播
發送標準廣播的三步驟
發送標準廣播:
//發送標準廣播
Intent intent =new Intent("com.dongnaoedu.chapter09.standard");
sendBroadcast(intent);
定義廣播接受者:
public class StanderdReceiver extends BroadcastReceiver {
public ?static final String ?STANDARD_ACTION="com.dongnaoedu.chapter09.standard";
//一旦收到廣播就會觸發onReceive的方法
?@Override
public void onReceive(Context context, Intent intent) {
if(intent!=null &&intent.getAction().equals(STANDARD_ACTION)){
Log.d("ning","收到一個標準廣播"); ???} ??} ??}
開關廣播接受者:
protected void onStart()
????{
????????super.onStart();
????????standerdReceiver = new StanderdReceiver();
????????//創建一個意圖過濾器,只處理STANDARD_ACTION廣播
????????IntentFilter filter = new IntentFilter(StanderdReceiver.STANDARD_ACTION);
????????registerReceiver(standerdReceiver,filter);
????}
protected void onStop()
????{
????????super.onStop();
????????//注銷接收器
????????unregisterReceiver(standerdReceiver);
}
發送有序廣播:(可截斷廣播abortBroadcast())
發送標準廣播:
?Intent intent=new Intent(ORDER_ACTION);
?sendOrderedBroadcast(intent,null);
定義廣播接受者:
????public void onReceive(Context context, Intent intent) {
????????if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){
????????????Log.d("ning","接收器B收到一個有序廣播");
????????}
}
public void onReceive(Context context, Intent intent) {
if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){
?????????????Log.d("ning","接收器A收到一個有序廣播");
????????}
????}
開關廣播接受者:
??protected void OnStart()
????{
????????super.onStart();
????????//注冊廣播A
????????orderAReceiver = new OrderAReceiver();
????????IntentFilter filterA=new IntentFilter(ORDER_ACTION);
????????filterA.setPriority(3);
????????registerReceiver(orderAReceiver,filterA);
????????//注冊廣播B
????????orderBReceiver = new OrderBReceiver();
????????IntentFilter filterB=new IntentFilter(ORDER_ACTION);
????????filterB.setPriority(6);
????????registerReceiver(orderAReceiver,filterB);
????}
????protected void OnStop()
????{
????????super.onStop();
????????unregisterReceiver(orderAReceiver);
????????unregisterReceiver(orderBReceiver);
????}
靜態注冊廣播:(不推薦)
??在AndroidManifest.xml中注冊,為靜態注冊
???權限:<uses-permission android:name="android.permission.VIBRATE"/>
注冊部分:<intent-filter>
????????????<action android:name="com.dongnaoedu.chapter09.shock"/>
??????????</intent-filter>
廣播定義: ??public void onReceive(Context context, Intent intent) {
????????if(intent!=null&&intent.getAction().equals(SHOCK_ACTION))
????????{
????????????Log.d("ning","震動");
?????Vibrator vb= (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
????????????vb.vibrate(500);
????????}
????}
廣播發送:
public void onClick(View view) {
????????String fullName="com.dongnaoedu.chapter09.shock";
????????Intent intent =new Intent("com.dongnaooedu.chapter09.shock");
????????//指定接收路徑
????????ComponentName componentName=new ComponentName(this,fullName);
????????//設置組件意圖
????????intent.setComponent(componentName);
????????sendBroadcast(intent);}
系統廣播:
??由系統發送的廣播,故注冊一個廣播接受者即可。
系統分鐘到達廣播:
??????protected void onStart(){
????????super.onStart();
????????//注冊一個分鐘變更的廣播接收器
????????timeReceiver = new TimeReceiver();
????????IntentFilter filter= new IntentFilter(Intent.ACTION_TIME_TICK);
????????registerReceiver(timeReceiver,filter);
????}
????protected void onStop(){
????????super.onStop();
????????//取消注冊廣播
????????unregisterReceiver(timeReceiver);
}
系統網絡變更廣播:
??????protected void onStart(){
????????super.onStart();
????????//注冊網絡變更的廣播接收器
????????networkReceiver = new NetWorkReceiver();
????????IntentFilter filter= new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
????????registerReceiver(networkReceiver,filter);
????}
????protected void onStop(){
????????super.onStop();
????????//取消注冊廣播
????????unregisterReceiver(networkReceiver);}
?屏幕變更事件:
?定時管理器:AlarmManager
①定義定時管理器AlarmReceiver
public class AlarmReceiver extends BroadcastReceiver {
public static final String ALARM_ACTION="com.dongnaoedu.chapter09.alarm";
private final Context mContext;
public AlarmReceiver(Context context){
????????super();
????????this.mContext=context; }
@Override
????public void onReceive(Context context, Intent intent) {
????????if(intent!=null && intent.getAction().equals(ALARM_ACTION) )
????????{??Log.d("ning","收到鬧鐘廣播"); ?}???}
??//發送鬧鐘廣播的方法
????public ?void ?sendAlarm()
????{ ??//設置意圖給延時意圖使用
????????Intent intent= new Intent(ALARM_ACTION);
????????//設置用于廣播的延遲意圖
????????PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,0,intent,PendingIntent.FLAG_IMMUTABLE);
????????//從系統中拿到鬧鐘管理器
????????AlarmManager alarmManager=(AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
????????//判斷版本,Android6.0
????????if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
????????????alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,1000,pendingIntent);
????????}else
????????{
????????????//設置鬧鐘管理器(android6.0,后該方法,在滅屏不保證發送廣播)
????????????alarmManager.set(AlarmManager.RTC_WAKEUP,1000,pendingIntent);
????????}
????}
}
②注冊定時管理器
??public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {
????private AlarmReceiver alarmReceiver;
????@Override
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_alarm);
????????findViewById(R.id.btn_alarm).setOnClickListener(this);
????}
????@Override
public void onClick(View view) {alarmReceiver.sendAlarm(); }
????protected void onStart(){
????????super.onStart();
????????alarmReceiver = new AlarmReceiver(getApplicationContext());
????????IntentFilter filter=new IntentFilter(AlarmReceiver.ALARM_ACTION);
????????registerReceiver(alarmReceiver,filter);
????}
????protected void onStop(){
????????super.onStop();
????????unregisterReceiver(alarmReceiver);
????}
}
豎屏與橫屏切換:
??切換時會將之前的生命周期結束,重新創建一個新的生命周期。若想不重啟,則
①在AndroidManifest.xml中,給activity節點增加Android:configChanges。
②修改活動頁面java代碼,重寫活動的onConfigurationChanged方法。
在AndroidManifest.xml中配置Android:screenOrientation=”portrait”可以指定橫屏或豎屏
回到桌面與切換任務列表:
??通過Intent.ACTION_CLOSE_SYSTEM_DIALOGS可判斷是否回到桌面,任務列表是否打開。
??收到意圖中reason字段,值為homekey時表示為回桌面,recentapps時為打開任務列表。
??在AndroidManifest.xml中加入android:supportsPictureInPicture="true"支持畫中畫權限
public class ReturnDesktopActivity extends AppCompatActivity {
????private DesktopRecevier desktopRecevier;
????@Override//在創建函數中注冊畫中畫
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_return_desktop);
????????desktopRecevier = new DesktopRecevier();
????????IntentFilter filter=new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
????????registerReceiver(desktopRecevier,filter);
????}
//注銷畫中畫
????@Override
????protected void onDestroy() {
????????super.onDestroy();
????????unregisterReceiver(desktopRecevier);
????}
????//進入畫中畫模式或退出畫中畫時觸發
????@Override
????public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
????????super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
????????if(isInPictureInPictureMode){
????????????Log.d("ning","進入畫中畫模式");
????????}else {
????????????Log.d("ning","退出畫中畫模式");
????????}
????}
????//定義一個返回桌面的廣播接收器
private class DesktopRecevier extends BoradOraderActivity{
public void onReceive(Context context, Intent intent){
if(intent!=null&&intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
String reason=intent.getStringExtra("reason");
??????????????if(!TextUtils.isEmpty(reason)&&(reason.equals("homekey")||reason.equals("recentapps"))){
??????????????????//android 8.0后才有畫中畫判斷一下
?if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O&&!isInPictureInPictureMode())
??{????????????//創建畫中畫模式的參數構建器
???PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
????Rational ratio = new Rational(10,5);?//指定屏幕寬高比例
????builder.setAspectRatio(ratio); ?????????????????????enterPictureInPictureMode(builder.build());???//進入畫中畫 ??????} ??????} ???} ??} }?}