Android 四大组件

Activity

生命周期图

Android 四大组件_第1张图片

生命周期

onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交
互。
onStop:停止活动。此时活动页面将不在屏幕上显示。
onDestroy:销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建
过程,而是走onRestart的重启过程。

Activity的启动模式

默认启动模式 standard
栈顶复用模式 singleTop
栈内复用模式 singleTask
全局唯一模式 singleInstance
Android 四大组件_第2张图片

生命周期举例

onCreate,onStart,onResume,onPause,onStop,onReStart,onDestroy
A页面刚创建时,onCreateA onStartA onResumeA
A返回,onPauseA onStopA onDestroyA
A返回后重新进入,A onCreateA onStartA onResumeA
A使用Home键或者任务键, onPauseA onStopA
A使用Home键之后进入,A onReStartA onStartA onResumeA
A使用Home键之后进入A,onReStartA onStartA onResumeA
A页面跳转到B页面, onPauseA onCreateB onStartB onResumeB onStopA
B页面返回到A页面,onPauseB onReStartA onStartA onResumeA onStopB onDestroyB
在B界面使用任务键上滑清除App onPauseB onStopB onDestroyB onDestroyA

广播

  1. BroadcastReceiver.onReceive默认是在主线程(UI线程)执行的,所以不能在广播接收器做耗时操作。

  2. 广播发送者可以指定接收广播的应用,只要将sendBroadcast(intent)的intent加上具体的包名就行了,intent.setPackage(“yourpackagename”)。

  3. 广播发送者和接收者都可以声明权限,这样只有在AndroidManifest声明对应权限,才能接收到相应的广播消息。

简介

广播接收者(BroadcastReceiver)是安卓的四大组件之一。
类似于日常生活中的广播,安卓系统中的广播也有发送者和接收者;
发送者通常是系统的应用程序,比如电池电量低,开关机,有电话或者短信到来,网络是否连接等都会向外发出广播。
接收者通常是用户创建的应用程序,注册对应的广播后,用来监听系统发出的广播,监听到后可针对广播事件做相应反馈。
广播发送者也可以是用户创建的应用程序,成为自定义广播。

接收广播

发送广播

1 发送有序广播
使用sendBroadcast()方法发送无序广播。无序广播发送时会在携带的intent对象中设置action属性值,所有注册广播时设置了相同action值的广播接收者都能够接收到该广播,没有绝对顺序。
2 发送无序广播
使用sendOrderedBroadcast()方法可以发送有序广播。广播发送者和接收者也会先匹配action属性值,再通过广播接收者设置的priority属性值决定广播的接收顺序,priority值越大越先接收到广播,如果值相同,先注册的先接收到广播。
3 指定广播接收者(一种特殊的有序广播)

4)Android四大组件将创建的类在配置文件中进行注册。

广播步骤

创建一个Receiver类。通过系统自定义的创建。
重写onReceive()方法。
在AndroidManifest中添加过滤器。
添加此广播对应的权限。

当前是否为静态广播接收不到,但是动态广播可以接收到。

对于静态注册的方法,在Android8.0之后就增加了限制。
从 Android 8.0(API 级别 26)开始,系统对清单声明的接收器施加了额外的限制。
如果您的应用面向 Android 8.0 或更高版本,则您不能使用清单为大多数隐式广播(不专门针对您的应用的广播)声明接收器。当用户积极使用您的应用程序时,您仍然可以使用上下文注册的接收器。
如果仍然想要使用静态注册的方式,在发送广播时需要做声明:componentName中分别为包和包中类的引用。
intent.setComponent(new ComponentName(“com.example.myreceiver”,“com.example.myreceiver.receiver”));

比如MainActivity中添加:

无序广播


## 无序广播

  @Override
  public void onClick(View v) {
      Intent intent = new Intent();
      // action为字符串形式的
      intent.setAction(MyBroadCastReceiver.myReceiver);
      sendBroadcast(intent);
  }

  @Override
  protected void onStart() {
      super.onStart();
      myBroadCastReceiver = new MyBroadCastReceiver();
      // 创建一个意图过滤器 只处理myReceiverBroadcastReceiver的广播
      IntentFilter intentFilter = new IntentFilter(MyBroadCastReceiver.myReceiver);
      // 注册接收器,注册之后才能正常接收广播
      registerReceiver(myBroadCastReceiver, intentFilter);
  }

  @Override
  protected void onStop() {
      super.onStop();
      // 注销接收器,注销之后不再接收广播
      unregisterReceiver(myBroadCastReceiver);
  }

public class MyBroadCastReceiver extends BroadcastReceiver {

    private static String TAG = "MyBroadCastReceiver";
    public static String myReceiver = "myReceiverBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction().equals(myReceiver)){
            Log.i(TAG, "onReceive: my receive");
        }
    }
}

有序广播

优先级最大可以声明为int型的最大值,也就是2147483647(为了最高优先级,拼了)。默认优先级应该为0;

// 源码

	private int mPriority;

    public IntentFilter(String action) {
        mPriority = 0;
        mActions = new ArrayList<String>();
        addAction(action);
    }

    public final void setPriority(int priority) {
        mPriority = priority;
    }

发送广播

// 发送广播
Intent intent2 = new Intent();
// action
intent2.setAction(orderBroadCastReceiver);
sendOrderedBroadcast(intent2,null);

IntentFilter中输入参数为action
Android 四大组件_第3张图片
// 注册

// todo 优先级 默认的优先级是多少
OrderAReceiver orderAReceiver = new OrderAReceiver();
IntentFilter intentFilterA = new IntentFilter(orderBroadCastReceiver);
intentFilterA.setPriority(10);
registerReceiver(orderAReceiver,intentFilterA);

// todo 优先级 默认的优先级是多少
OrderBReceiver orderBReceiver = new OrderBReceiver();
IntentFilter intentFilterB = new IntentFilter(orderBroadCastReceiver);
intentFilterB.setPriority(8);
registerReceiver(orderAReceiver,intentFilterB);


// 取消注册
unregisterReceiver(orderAReceiver);
unregisterReceiver(orderBReceiver);

// 接收
registerReceiver 输入参数分别为BroadcastReceiver receiver, IntentFilter filter
在这里插入图片描述

public class OrderAReceiver extends BroadcastReceiver {
    private String TAG = "HHH.OrderAReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction().equals(MainActivity.orderBroadCastReceiver)){
            Log.i(TAG, "OrderAReceiver onReceive...");
        }
    }
}```

public class OrderBReceiver extends BroadcastReceiver {
    private String TAG = "HHH.OrderBReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction().equals(MainActivity.orderBroadCastReceiver)){
            Log.i(TAG, "OrderBReceiver onReceive...");
        }

    }
}
// 结果

```java
2022-06-17 17:02:05.777 21164-21164/cn.jj.myapplication I/HHH.OrderAReceiver: OrderAReceiver onReceive...
2022-06-17 17:02:05.779 21164-21164/cn.jj.myapplication I/HHH.OrderBReceiver: OrderBReceiver onReceive...

静态广播

发送

// public static String shakeBroadcast = "MyShakeBroadcast";
intent3.setAction(shakeBroadcast);
ComponentName componentName = new ComponentName(this,"cn.jj.myapplication.receiver.BroadStaticReceiver");
intent3.setComponent(componentName);
sendBroadcast(intent3);

接收

public class BroadStaticReceiver extends BroadcastReceiver {
    private String TAG = "HHH.BroadStaticReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction().equals(MainActivity.shakeBroadcast)){
            Log.i(TAG, "onReceive: BroadStaticReceiver");
            Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(500);
        }
    }
}

清单文件

        <receiver
            android:name=".receiver.BroadStaticReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="MyShakeBroadcast"/>
            </intent-filter>
        </receiver>

服务

1)简介
服务也是Android的四大组件之一。被称为是没有界面的activity;它拥有自己的生命周期,可以不随着activity的销毁而销毁。
2)创建方式
需要创建继承自Service类的自定义类,并在配置文件中使用标签完成注册,该类回复写一个同名构造方法和一个onBind()的回调方法。
3)使用方法
a) 开启和停止服务
使用startService()方法开启服务,使用stopService()方法停止服务。
适用于例如开启和关闭游戏背景音乐的场景。
b) 绑定和解绑服务
使用bindService()方法绑定服务,使用unbindService()方法解绑服务。
适用于服务中私有方法,Activity通过绑定服务后,调用服务中的方法。例如:音乐播放器。
4)服务与Activity中间的通信
a) 服务的本地调用方法
调用服务的Activity与服务在同一个应用程序中,绑定服务后调用服务中的方法。
b) 服务的远程方法调用
调用服务的Activity与服务在同一个应用程序中,绑定服务后调用服务中的方法。

context:
它描述的是一个应用程序的环境,即上下文
它类是一个抽象的类,android提供了一个具体的通用实现类contextIml类。
它就像是一个大管家,是一个访问全局信息的接口。通过它我们可以获取应用程度 的资源的类,包括一些应用级的操作,如启动一个activity,发送广播,接受Intent信息。

Context的继承关系图如下图所示:
Android 四大组件_第4张图片

你可能感兴趣的:(android,android,studio,android-studio)