1. 四大组件是什么?

  • Activity(活动):用于表现功能
  • Service(服务):后台运行服务,不提供界面呈现
  • BroadcastReceiver(广播接收器):用来接收广播
  • ContentProvider(内容提供者):支持在多个应用中存储和读取数据,相当于数据库。

2. 四个组件的生命周期?

1. Activity生命周期图

2. Fragment生命周期图

3. Service生命周期:首先Service有两种启动方式,而在这两种启动方式下,它的生命周期不同。

  1. * 通过startService()方法启动

初始化结束后系统会调用 void onStart(Intent intent) 方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法。

  1. * 通过bindService ()方法启动的服务

初始化结束后系统会调用 IBinder onBind(Intent intent) 方法,用来绑定传递给bindService 的Intent 的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法。

3.Activity的四种启动模式对比

  • Standard:标准模式

这是 Activity 默认的启动模式,这种模式下,每次 startActivity 都会在栈顶创建一个新的实例,在同一个任务中可以存在多个Activity 的实例。

  • SingeTop:栈顶复用模式

栈顶复用,也就是说,要启动 singleTop 模式的 Activity,如果它恰好在当前栈顶,那么直接复用,执行其 onNewIntent 方法。否则,就重新创建一个实例入栈。

  • SingleTask:栈内复用模式

栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 模式一样,系统也会回调其 onNewIntent。当这个Activity上面有其他Activity时会将它们全部出栈(自动执行clearTop),然后再调用onNewIntent()方法。

  • SingleInstance:单实例模式

单实例模式。这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此种模式的 Activity 只能单独地位于一个任务栈中。

设置方式:

  1. <activity
  2. android:name=".SecondActivity"
  3. android:label="@string/title_activity_second"
  4. android:launchMode="singleTask"//<-----------------------
  5. android:taskAffinity="com.xplee.task.task.SecondActivity"
  6. android:theme="@style/AppTheme.NoActionBar"></activity>

4.Activity在有Dialog(对话框)时按Home键的生命周期?

当我们的Activity上弹出Dialog对话框时,程序的生命周期依然是onCreate() —> onStart() —> onResume(),在弹出Dialog的时候并没有onPause()和onStop()方法。而在此时我们按下Home键,才会继续执行onPause()和onStop()方法。这说明对话框并没有使Activity进入后台,而是在点击了Home键后Activity才进入后台工作。

原因就是,其实Dialog是Activity的一个组件,此时Activity并不是不可见,而是被Dialog组件覆盖了其他的组件,此时我们无法对其他组件进行操作而已。

5.两个Activity之间跳转时必然会执行的方法?

首先定义两个Activity,分别为A和B。

当我们在A中激活B时,A调用onPause()方法,此时B出现在屏幕时,B调用onCreate()、onStart()、onResume()。

这个时候B【B不是一个透明的窗体或对话框的形式】已经覆盖了A的窗体,A会调用onStop()方法。

6.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命周期回调方法?

首先定义两个Activity,分别为A和B。

完整顺序为:A调用onCreate()方法 —> onStart()方法 —> onResume()方法。当A启动B时,A调用onPause()方法,然后调用新的Activity B,此时调用onCreate()方法 —> onStart()方法 —> onResume()方法将新Activity激活。之后A再调用onStop()方法。当A再次回到前台时,B调用onPause()方法,A调用onRestart()方法 —> onStart()方法 —> onResume()方法,最后调用B的onStop()方法 —> onDestory()方法。

弹出Dialog时,调用onCreate()方法 —> onStart()方法 —> onResume()方法。

7.fragment各种情况下的生命周期?

8.如何实现Fragment的滑动?

将Fragment与viewpager绑定,通过viewpager中的touch事件,会进行move事件的滑动处理。

9.fragment之间传递数据的方法?

方法一:

  1. 在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称;
  1. //MainFragment.java文件中
  2. public void setData(String string) {
  3. bt_main.setText(string);
  4. }
  1. 在MenuFragment中的ListView条目点击事件中通过标签获取到MainFragment,并调用对应的setData()方法,将数据设置进去,从而达到数据传递的目的。
  1. lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  4. MainFragment mainFragment =
  5. (MainFragment) getActivity()
  6. .getSupportFragmentManager()
  7. .findFragmentByTag("mainFragment");
  8. mainFragment.setData(mDatas.get(position));
  9. }
  10. });

方法二:

采取接口回调的方式进行数据传递。

方法三:EventBus

10.Activity怎么和Service绑定?

这需要实现sercice中的onBind()函数以返回service实例给activity

  1. 创建service类和activity类。

    2.在service类中定义一个内部类继承自Binder()类:
  1. public class MyBinder extends Binder{
  2. public Service1 getService(){
  3. return Service1.this;
  4. }
  5. }

实例化onBind()方法:

  1. private final IBinder binder = new MyyBinder();
  2. @Override
  3. public IBinder onBind(Intent intent){
  4. Log.i(LOG"onBind......");
  5. return binder;
  6. }
  1. 在activity中完成绑定
  1. Intent intent = new Intent(Activity1.this,Activity2.class);
  2. bindService(intent,conn,Context.BIND_AUTO_CREATE);
  3. // bindService的第二个参数是一个ServiceConnection类型的参数。service和其他组件之间的连接都表示为一个ServiceConnection,要想将service和其他组件进行绑定,就需要实现一个新的ServiceConnection。
  4. public ServiceConnection conn= new ServiceConnection() {
  5. @Override
  6. public void onServiceDisconnected(ComponentName name) {
  7. //当连接意外断开时调用
  8. Log.i(LOG, "onServiceDisconnected>>>>>>>>");
  9. myservice = null;
  10. }
  11. @Override
  12. public void onServiceConnected(ComponentName name, IBinder service) {
  13. //当建立连接时调用
  14. Log.i(LOG, "onServiceConnected>>>>>>>>");
  15. myservice = ((Service1.MyBinder)service).getService();
  16. }
  17. };

11.service的生命周期?

  1. 被启动的服务(startService())的生命周期:

如果一个Service被某个Activity 调用Context.startService() 方法启动,那么不管是否有Activity使用bindService()绑定或unbindService()解除绑定到该Service,该Service都在后台运行。如果一个Service被多次执行startService(),它的onCreate()方法只会调用一次,也就是说该Service只会创建一个实例,而它的onStartCommand()将会被调用多次(对应调用startService()的次数)。该Service将会一直在后台运行,直到被调用stopService(),或自身的stopSelf方法。当然如果系统资源不足,系统也可能结束服务。

  1. 被绑定的服务(bindService())的生命周期。

如果一个Service被调用 Context.bindService ()方法绑定启动,不管调用bindService()调用几次,onCreate()方法都只会调用一次,而onStartCommand()方法始终不会被调用,这时会调用onBind()方法。当连接建立之后,Service将会一直运行,除非调用Context.unbindService() 断开连接或者之前调用bindService() 的 Context 不存在了(如该Activity被finish),系统将会自动停止Service,对应onDestroy()将被调用。

  1. 被启动又被绑定的服务的生命周期。

如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。调用unbindService()将不会停止Service,而必须调用stopService()或Service的stopSelf()方法来停止服务。

  1. 当服务被停止时清除服务。

当一个Service被终止时,Service的onDestroy()方法将会被调用,在这里应当做一些清除工作,如停止在Service中创建并运行的线程等。

12.activity和service的绑定方式以及怎么在Activity 中启动自己对应的Service?

1、activity能进行绑定得益于Serviece的接口。为了支持Service的绑定,实现onBind方法。

2、Service和Activity的连接可以用ServiceConnection来实现。需要实现一个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。

3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显示或隐式)和一个你实现了的ServiceConnection的实例

13.Service的启动方式?

采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致 多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。

14.谈谈ContentProvider、ContentResolver、ContentObserver之间的关系?

ContentProvider:

  • 四大组件的内容提供者,主要用来对外提供数据,

  • 实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等

  • 一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

ContentResolver:

  • 内容解析者,用于获取内容提供者提供的数据
  • ContentResolver.notifyChange(uri)发出消息

ContentObserver:

  • 内容监听者,可以监听数据的改变状态
  • 目的时观察特定的Uri引起的数据库的变化,进而做一些相应的处理,类似于数据库技术中的触发器(Tigger)。
  • ContentResolver.registerContentObserver()监听消息

15.广播的分类?

  • 无序广播发送代码:
  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. }
  7. public void click(View v){
  8. //启动界面 startActivity
  9. //发送广播 sendBroadcast
  10. Intent intent = new Intent();
  11. intent.setAction("com.itheima.cctv.action.NEWS");
  12. intent.putExtra("data", "我是一个无须的广播");
  13. sendBroadcast(intent);
  14. }
  15. }
  • 无序广播的监听代码:
  1. public class CctvReceiver extends BroadcastReceiver {
  2. private static final String TAG = "CctvReceiver";
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. String data = intent.getStringExtra("data");
  6. Log.d(TAG, "data==="+data);
  7. }
  8. }
  9. xml
  10. <receiver android:name="com.itheima.cctv.CctvReceiver">
  11. <intent-filter >
  12. <!--这里监听的广播就是上面发送广播设置的intent.setAction("com.itheima.cctv.action.NEWS");-->
  13. <action android:name="com.itheima.cctv.action.NEWS"/>
  14. </intent-filter>
  15. </receiver>
  • 有序广播发送代码:
  1. public class ShengReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. Log.d("vivi", "我是省级部门,我收到的指令是:"+getResultData());
  5. //getResultData()是用来获取有序广播里面的数值.这里的信息是:
  6. //主席讲话:每人奖励10斤土豆
  7. setResultData("主席讲话:每人奖励7斤土豆");//有序广播的数值,可以被修改,后面的程序在接受到这个广播,就会变成,现在我们改变的值了
  8. //有序广播传输是可以终止的.但是最终的接受者就算在终止之后,也是可以接受到数据的
  9. //abortBroadcast();
  10. }
  11. }
  12. public class ShiReceiver extends BroadcastReceiver {
  13. @Override
  14. public void onReceive(Context context, Intent intent) {
  15. Log.d("vivi", "我是市级部门,我收到的指令是:"+getResultData());
  16. //因为上面修改了数据,所以这里获取到的数据是:主席讲话:每人奖励7斤土豆
  17. }
  18. }
  19. <!--有序广播的优先级别使用 android:priority=""来指定,最高是1000,最低是-1000-->
  20. <receiver android:name="com.itheima.region.ShengReceiver">
  21. <intent-filter android:priority="1000">
  22. <action android:name="com.itheima.gov.action.POTATO"/>
  23. </intent-filter>
  24. </receiver>
  25. <receiver android:name="com.itheima.region.ShiReceiver">
  26. <intent-filter android:priority="500">
  27. <action android:name="com.itheima.gov.action.POTATO"/>
  28. </intent-filter>
  29. </receiver>
  • 有序广播接收代码:
  1. public class MyReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. Log.d("vivi", "我是恩恩主席的内线,我收到的指令是:"+getResultData());
  5. }
  6. }

16. Handler(Android SDK提供给开发者方便进行异步消息处理的类):

1.Handler四大组件:

  1. Message

    Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。

    例:Message的what字段、arg1字段、arg2字段来携带整型数据,obj字段携带一个Object对象。

  2. Handler

    处理者,它主要用来发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,消息经过处理后,最终传递到Handler的handlerMessage()方法中

  3. MessageQueue

    消息队列,它主要用来存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理。

  4. Looper

    是每个线程中MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,每当发现MessageQueue中存在一条消息,就会将其取出传递到Handler的handleMessage()方法当中。

异步消息处理流程:

  1. 在主线程中创建一个Handler对象;
  2. 重写handleMessage()方法
  3. 当子线程需要进行UI操作时,创建一个Message对象,并通过Handler将消息发送出去;
  4. 消息添加到MessageQueue的队列中等待被处理;
  5. Looper在MessageQueue中取出待处理的消息,发回Handler的handleMessage()方法中。

Android复习准备的更多相关文章

  1. Android复习资料

    转载:http://blog.csdn.net/huachao1001/article/details/53156582 在10月份开始就没有再参与校招了,面试过程真的很累,有时现场等面试一等就是几个 ...

  2. android复习第一天-----简单的android常识

    前言:要去面试了,这些天花一些事件把android中简单的知识点来串联的复习一下 1,android中的工程结构 src文件夹:存储android文件的源代码 gen文件夹:有工具自动生成,不要去修改 ...

  3. Android复习笔记--架构与版本

    #Android架构: 1. Linux 内核层 Android 系统是基于Linux 2.6 内核的,这一层为Android 设备的各种硬件提供了底 层的驱动,如显示驱动.音频驱动.照相机驱动.蓝牙 ...

  4. Android复习笔记--Intent

    Intent是Android中各组件跳转的重要方式,一般可悲用于启动活动.启动服务.以及发送广播等场景. #显示Intent 主要主要用于启动已知的组件 //发送方  Intent intent = ...

  5. Android复习笔记--Activity

    #Activity注册 Android四大组件(Activity,Service,Broadcast Receiver, Content Provider)都需要在AndroidManifest中注册 ...

  6. Android复习指南

    基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域.这里面其实有很多东西,各大面试宝典都有列举. 在这只列举了Android客户端所需要的和我 ...

  7. android复习第二天------布局

    1,在4,0版本前一共有五种布局,且都是ViewGroup的子类分别是 RelativeLayout(相对),AbsoluteLayout(绝对),LinearLayout(线性),FrameLayo ...

  8. 【Android 复习】:第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    一.实现的效果图 也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似,有图才有真相嘛,呵呵.           二.编码前的准 ...

  9. 【Android 复习】:第01期:引导界面(一)ViewPager介绍和使用详解

    一.ViewPager实现的效果图 二.ViewPager实现的功能 看到上面的效果图,想必大家已经猜出了这个类是干吗用的了,ViewPager类提供了多界面切换的新效果, 新效果有如下特征: < ...

  10. 【Android 复习】:Android之ViewFlipper(二)

    通过手势移动屏幕 上面是通过屏幕上的按钮来在屏幕间切换的,这看起来多少有点不符合Android的风格,如果要是能通过手势的左右滑动来实现屏幕的切换就比较优雅了. 通过android.view.Gest ...

随机推荐

  1. Python实用笔记 (16)函数式编程——偏函数

    假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去: def int2(x, base=2): re ...

  2. dubbo源码解析之负载均衡

    在分布式系统中,负载均衡是必不可少的一个模块,dubbo 中提供了五种负载均衡的实现,在阅读这块源码之前,建议先学习负载均衡的基础知识.把看源码当做一个印证自己心中所想的过程,这样会得到事半功倍的效果 ...

  3. jQurey zTree Demo 3.5

    https://jeesite.gitee.io/front/jquery-ztree/3.5/demo/cn/index.html

  4. 如何修复 WordPress 中的 HTTP 错误

    如何修复我们会向你介绍,如何在 Linux VPS 上修复 WordPress 中的 HTTP 错误. 下面列出了 WordPress 用户遇到的最常见的 HTTP 错误,我们的建议侧重于如何发现错误 ...

  5. let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel

    let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...

  6. 石子合并——区间dp

    石子合并(3种变形) <1> 题目: 有N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分, ...

  7. JSOI BZOJ4472 salesman

    题目传送门 题目大意 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益.这些净收益可能 ...

  8. Kail系统更新指令

    0x00源更新 国内更新源 leafpad /etc/apt/sources.list 然后复制粘贴下面的源 #kali官方源 deb http://http.kali.org/kali kali-r ...

  9. 接口测试基础——session认证和token认证

    总算是把这个过程理清楚了,现在我们的思路是:what?why?How?,实际上这些个机制产生的内部逻辑是从下至上的的:遇到问题了,想办法解决,总结归纳并取名.从解决一些小问题开始生长,不断打补丁直至完 ...

  10. Java多线程编程基础知识汇总

    多线程简介 多任务   现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...