Android基础知识汇总

Fragment的生命周期和activity如何的一个关系
引用知识库里的一张图片
这里写图片描述

为什么在Service中创建子线程而不是Activity中
因为activity很难对Thread进行控制,当Activity 被销毁之后,就没有任何其他的办法可以再重新获取到之前创建的子线程的实例,而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作,但Service不同,所有的Activity都可以与Service进行关联,然后很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service进行关联,就能够获取到原有的Service中的 Binder的实例,因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行管理控制的情况。

Service的两种启动方法,有什么区别

1、在Context中通过public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法来进行Service与Context的关联并启动,并且Service的生命周期依附于Context(不求同时同分同秒生!但求同时同分同秒屎!!)。

2、通过public ComponentName startService(Intent service)方法去启动一个Service,此时Service的生命周期与启动它的Context无关。

3、要注意的是,whatever,都需要在xml里注册你的Service,就像这样:

   <service
        android:name=".packnameName.youServiceName"
        android:enabled="true" />

广播(Broadcast Receiver)的两种动态注册和静态注册有什么区别

静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理

动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了

Context区别
1、Activity和Service以及Application的context是不一样的,Activity继承自ContextThemeWrapper,其他的继承自ContextWrapper。
2、每一个Activity和Service以及Application的Context都是一个新的ContextImpl对象
3、getApplication()用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法,getApplicationContext()比getApplication()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。
4、Activity在创建的时候会new一个ContextImpl对象并在attach方法中关联它,Application和Service也差不多。ContextWrapper的方法内部都是转调ContextImpl的方法
5、创建对话框传入Application的Context是不可以的

HandlerThread的特点

  • HandlerThread本质上是一个线程类,它继承了Thread
  • HandlerThread有自己的内部Looper对象,可以进行Looper循环
  • 通过获取HandlerThread的Looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务
  • 优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低。
  • 与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。

    IntentService是什么

    1、 IntentService简介
    IntentService是Service的子类,比普通的Service增加了额外的功能,Service本身存在的两个问题:

  • Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
  • Service也不开启一个新线程,因此不应该在Service中直接处理耗时的任务;

    2、IntentService特征

  • 会创建独立的线程来处理所有的Intent请求;
  • 会创建独立的线程来处理onHandleIntent()方法中的代码,无需处理多线程问题;
  • 所有请求处理完成之后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
  • 为Service的onBind()提供默认实现,返回null;
  • 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中。

总结:
IntentService 是继承Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf(),另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent()回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个。

获取sharedpreference的三种方法及区别

现在我目前知道可以获取SharedPreferences实例的常用方法有三个:

1.通过Context的getSharedPreferences(String name,int mode)。
因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。

2.通过Activity的getPreferences(int mode)。
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。

3.通过SharedPreferenceManager的静态方法getDefaultSharedPreferences(Context context)。
PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。

mode 的取值和含义:
mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。
mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。
mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入

SharedPreference.Editor的apply和commit方法区别
在Android中存储数据我们经常用到preference,并且在提交数据时用到Editor的commit方法,但是有时候系统也会用apply方法,那么,

这两个方法的主要区别是:

1、apply没有返回值,commit会返回一个Boolean值,表明是否修改成功

2、apply是将修改的数据提交到了内存,而后异步真正提交到硬件磁盘;而commit是同步提交到硬件磁盘,因此在多个并发的提交commit的时候,它们会等待正在处理的commit保存到磁盘后再操作,从而降低了效率;而apply只是原子的提交到内容,后面有调用apply的函数,将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率

3、apply方法不会提示任何失败的提示

由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要commit的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值