首页 > 编程知识 正文

安卓的四大组件是哪些,安卓系统四大组件

时间:2023-05-05 02:12:58 阅读:149793 作者:498

虽然Android四大组件已经使用了好几次,但是还是很容易忘记细节,所以写吧。

活动

Activity生命周期

在此处插入图像说明

Activity的简单生命周期流程是onCreate (; onStart (; 【注:此时Activity处于不可见状态】onResume (); 【注:在这种情况下,Activity正在运行】onPause (); 【注:此时Activity处于暂停状态】onStop (); 【注:此时Activity处于停滞状态】onDestroy (); 【注】调用此方法后,Activity的生命周期将结束】

其中,当Activity正在重新启动且从不可见变为可见时,将调用onRestart ()。 这意味着一个Activity包含七个生命周期进程

当Activity被其他Activity覆盖时,系统将调用onPause (调用该方法以暂停当前Activity的执行,如果用户取消覆盖,则为onResume )方法返回运行状态

当Activity跳转到新的Activity界面或后台或锁定时,系统将调用onPause ()。 然后调用onStop (; 如果将Activity置于停滞状态,然后再次返回到其Activity界面(从上一个Activity或后台更改为前端或解除锁定时),系统将调用onRestart ()。 调用onStart (; 最后,调用onResume ()方法将Activity置于运行状态

当用户退出Activity时,onPause (); 然后调用onStop (; 最后调用onDestory (); 结束Activity生命周期

即使在Activity中显示dialog对话框,Activity也会显示onPause (); 仅当Activity启动dialog样式的Activity时调用

如果Activity意外退出,系统将调用onSaveInstance来保存当前的Activity状态。 此方法在onStop之前调用,在重新创建Activity时调用onRestoreInstanceState。 此外,将使用Activity销毁时的onSaveInstanceState方法保存的bundle对象作为参数传递给onRestoreInstanceState和onCreate方法

活动的四种启动模式

Activity有四种启动模式:标准、简单、单任务和单实例。 这四种模式是清单文件的

标准模式:在此模式下,activity将进入缺省情况下启动的activity所属的任务堆栈。 这也是默认模式

单工模式:栈顶复用模式。 如果新的activity位于任务堆栈的堆栈顶部,则不会重新创建activity,而是回调onNewIntent方法。

单任务模式:堆栈内复用模式。 只要activity存在于堆栈中,多次启动该activity就不会重新创建实例,而是回调到onNewIntent。 该模式称为单实例模式,只存在一个。 如果有,则直接从堆栈中调用,否则在堆栈中创建并按入

单实例模式:单实例模式。 此模式下的activity与singleTask有点类似,但实际上是直接调用的,否则会创建并放置在堆栈中。 但是,singleTask可以与其他activity位于同一堆栈上,而singleInstance只是创建了它

服务

Service包括Service (如果在主线程上运行并执行耗时的操作,则可以在Service中创建并执行异步)和IntentService (这是一种异步服务,是Service的子类)

服务

服务的两种启动方法

用start方法启动服务

创建类继承服务

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

publicclassmyserviceextendsservice {

公共我的服务(

}

@Override

publicibinderonbind { intent intent }

//todo : returnthecommunicationchanneltotheservice

thrownewunsupportedoperationexcep

tion("Not yet implemented");

}

}

在清单文件中注册这个服务

android:name=".MyService"

android:enabled="true"

android:exported="true">

通过startService方法启动服务

Intent intent = new Intent(this, MyService.class);

startService(intent);

当不用服务的时候通过stopService()方法停止该服务

stopService(intent);

特点: 通过start方法启动的service一旦服务开启就跟调用者(开启者)没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。

通过bind的方式启动服务

创建一个类继承Service

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

public class MyService extends Service {

public MyService() {

}

@Override

public IBinder onBind(Intent intent) {

// TODO: Return the communication channel to the service.

throw new UnsupportedOperationException("Not yet implemented");

}

}

在清单文件中注册这个服务

android:name=".MyService"

android:enabled="true"

android:exported="true">

通过bindService方法启动服务

Intent intent = new Intent(this, MyService.class);

bindService(Intent,ServiceConnection,int);

当不用服务的时候通过unbindService()方法停止该服务

unbindService(ServiceConnection);

特点:使用bind方法启动的服务,则调用者挂了,服务也挂了,调用者可以调用服务中的方法

远程服务

调用者与Service不在同一个进程,这是一种跨进程通信的方式Android绑定远程服务

步骤:

在服务的内部创建一个内部类,提供一个方法,可以间接调用服务的方法

把暴露的接口文件的扩展名改为.aidl文件 去掉访问修饰符

实现服务的onbind方法,继承Bander和实现aidl定义的接口,提供给外界可调用的方法

在activity 中绑定服务。bindService()

在服务成功绑定的时候会回调 onServiceConnected方法 传递一个 IBinder对象

aidl定义的接口.Stub.asInterface(binder) 调用接口里面的方法

IntentService

这个Service在上面也说过,是一个异步服务

IntentService特征:

会创建独立的worker线程来处理所有的Intent请求;

会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;

所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;

为Service的onBind()提供默认实现,返回null;

为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

BroadcastReceiver

广播分为两种,一种是普通广播,或者称为无序广播,另一种是有序广播

无序广播与有序广播

无序广播是完全异步的,在同一时刻在逻辑上是能够被所有的接收者接收到的,传递的效率高,缺点是接收者不能处理结果传给下个接收者,并且无法终止广播的传播(其实有序广播就是和这个相反的,有顺序的传播,两个广播的定义就是完全相反的,这个比较好记)

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在onReceive中执行一些耗时操作

创建一个广播的步骤:

创建一个类继承BroadcastReceiver,并且重写其onReceive方法

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Log.i("fuck","intent-action : " + intent.getAction());

if(intent.getAction().equals("test")){

Toast.makeText(context,"fuck",Toast.LENGTH_LONG).show();

}

}

}

在清单文件中注册(静态注册)

//广播接收器

//这里自定义一个广播动作

或者动态注册

registerReceiver(new MyBroadcastReceiver(),new IntentFilter("test"));

加上权限

发送广播

Intent intent = new Intent("test");

sendBroadcast(intent);

静态注册和动态注册区别

动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。

静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

当广播为有序广播时:

优先级高的先接收

同优先级的广播接收器,动态优先于静态

同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

当广播为普通广播时:

无视优先级,动态广播接收器优先于静态广播接收器

同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

Service小结:

在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。

使用广播必须要有一个intent 对象必设置其action动作对象

使用广播必须在配置文件中显式的指明该广播对象

每次接收广播都会重新生成一个接收广播的对象

在BroadCastReceiver中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理

如果在AndroidManifest.xml中注册,当应用程序关闭的时候,也会接收到广播。在应用程序中注册就不产生这种情况了。

ContentProvider

contentprovider是android四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。contentprovider是android中一种跨程序共享数据的重要组件。

自定义的内容提供者没用过,因为没有实际的业务需求,系统的内容提供者用的比较多,所以具体也不知道该如何记录ContentProvider

学习链接:内容提供者(ContentProvider)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。