AndroidAndroid开发面试

Android四大组件

2019-02-20  本文已影响0人  心无止境_GX

Android四大组件用了很多遍了,但还是有很多细节容易忘记,所以就写下来吧!

Activity

Activity的生命周期

在这里插入图片描述

Activity的简单生命周期流程为onCreate();→onStart();【注:此时Activity处于不可见状态】→onResume();【注:此时Activity处于运行状态】→onPause();【注:此时Activity处于暂停状态】→onStop();【注:此时Activity处于停滞状态】→onDestroy();【注:调用了此方法后Activity生命周期结束】
其中当Activity正在重新启动的时候,从不可见变为可见的时候,会调用到onRestart();也就是说一个Activity包含七个生命周期流程

Activity的四种启动模式

Activity有四种启动模式 standard,singleTop,singleTask,singleInstance,这四种模式我们可以在清单文件的<Activity节点下通过android:launchMode来进行配置

Service

Service分为两种,一种是Service(这一种是运行在主线程中的,如果要执行耗时操作,可在service中创建一个异步来执行),一种是IntentService(这是一种异步服务,是继承于Service的子类),所以推荐当要执行耗时操作时使用IntentService,如果不耗时,我们可以使用Service

Service

Service的两种启动方式

  1. 通过start方法开启服务
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");
    }
}
   <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>
   Intent intent = new Intent(this, MyService.class);
   startService(intent);
stopService(intent);

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

  1. 通过bind的方式启动服务
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");
    }
}
   <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>
   Intent intent = new Intent(this, MyService.class);
   bindService(Intent,ServiceConnection,int);
unbindService(ServiceConnection);

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

远程服务

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

步骤:

IntentService

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

BroadcastReceiver

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

无序广播与有序广播

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

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

广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在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();
        }
    }

}
     //广播接收器
        <receiver android:name=".broadcast.MyBroadcastReceiver">

            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="test"/>//这里自定义一个广播动作
            </intent-filter>

        </receiver>

或者动态注册

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

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

 Intent intent = new Intent("test");
 sendBroadcast(intent);

静态注册和动态注册区别

动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

  1. 优先级高的先接收
  2. 同优先级的广播接收器,动态优先于静态
  3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
  1. 无视优先级,动态广播接收器优先于静态广播接收器
  2. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

Service小结:

ContentProvider

contentprovider是android四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。contentprovider是android中一种跨程序共享数据的重要组件。
自定义的内容提供者没用过,因为没有实际的业务需求,系统的内容提供者用的比较多,所以具体也不知道该如何记录ContentProvider
学习链接:内容提供者(ContentProvider)

上一篇 下一篇

猜你喜欢

热点阅读