zoukankan      html  css  js  c++  java
  • 百度的android采访分析

    今天早上10分,我接到一个电话采访百度。当然,我说提前。我的病是多么强烈延迟。所以我也没怎么准备,当然,我也看他们的真实水平的思考。在这次审查中!

    !!

    。!

    !。!!

    !。!

    !。!!

    !!。!

    !。!!!

    。!

    !!

    !!

    !!

    !!!!!。!!

    。!!

    !!!

    !!

    废话不多说

    上来就是百度的一个技术人员打过电话来,简单确认了我的信息之后。就開始问问题。此刻我的心中有一万匹草泥马奔腾。

    。。。開始问的是数据结构和算法的相关知识,我本科学过一小点,只是没有及时复习全忘记了。。。接下来就是android的相关知识了,这部分我算是回答的中规中矩,有一个关于ANR的问题,没有回答上来。。。后面是关于java的问题,我也没有回答好。

    面试的题目

    1. 二叉树的前序遍历
    2. 简单的阐述一下冒泡算法
    3. android的四大组件及其功能。

    4. service怎样保证杀掉后重新启动
    5. ANR问题
    6. java的泛型

      面试完的恶补

      我自己又去各大站点看了一下。以下是我总结的问题和答案的地址
      1.Activity之间的跳转
      http://android.blog.51cto.com/268543/323982
      http://blog.csdn.net/super1900/article/details/4098615
      2.android View刷新机制
      http://blog.csdn.net/dragondog/article/details/6454551
      3.实现Strlen(char* str)
      int strlen(const char *str)
      {
      if (‘’ == *str)
      return 0;
      else
      return strlen(str+1) + 1;
      }
      4.实现strcpy(char * str)
      第一种:
      void strcpy( char *strDest, char *strSrc )
      {
        while( (strDest++ = strSrc++) != ‘’ );
      //把后一个字符串的第一个字符赋值给前面一个字符串的第一个字符的地址上,假设碰到’’就退出.此
      时后一个字符串也把’’赋值给了前一个字符串的尾部
      }
      5.常见数据结构的差别
      http://blog.csdn.net/ceasar11/article/details/12615225
      http://www.360doc.com/content/12/1009/16/9400799_240455229.shtml
      6.android WiFi定位
      http://www.zhihu.com/question/21365402
      7.C++ 引用与指针的差别
      http://blog.csdn.net/dujiangyan101/article/details/2844138
      9.Android为每个应用程序分配的内存大小是多少?
      http://www.cnblogs.com/mythou/p/3203536.html
      16m也有的是24m
      10.排序算法总结
      http://blog.chinaunix.net/uid-25906157-id-3318529.html
      11.Integer与Int的差别 java
      http://developer.51cto.com/art/200906/130459.htm
      12.android AIDL
      http://blog.csdn.net/android_tutor/article/details/6427680
      13.请说明一下acitivity的生命周期?
      http://blog.csdn.net/android_tutor/article/details/6427680
      14.请说明一下android程序的入口有哪些?
      http://blog.csdn.net/zhaokaiqiang1992/article/details/25154981
      http://blog.csdn.net/zcmain/article/details/14451591
      15.Intent是什么有哪些功能?
      http://blog.csdn.net/dlmu2001/article/details/3478266
      16.android经常使用的存储方式有哪些?假设想要保留登录时的username和password。用哪个比較好?
      http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html
      17.不同尺寸的手机是怎么适配的?
      http://www.zhihu.com/question/19929388
      18.优化LIstView控件
      http://blog.csdn.net/zhaokaiqiang1992/article/details/33405181

    最后给大家一个android面试问答总结,不用谢,还有疑问的欢迎留言交流

    1、 Android的四大组件是哪些,它们的作用?
    答:Activity:Activity是Android程序与用户交互的窗体。是Android构造块中最主要的一种。它须要为保持各界面的状态,做非常多持久化的事情。妥善管理生命周期以及一些跳转逻辑
    service:后台服务于Activity,封装有一个完整的功能逻辑实现。接受上层指令,完毕相关的食物,定义好须要接受的Intent提供同步和异步的接口
    Content Provider:是Android提供的第三方应用数据的訪问方案。能够派生Content Provider类,对外提供数据。能够像数据库一样进行选择排序。屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径
    BroadCast Receiver:接受一种或者多种Intent作触发事件。接受相关消息。做一些简单处理,转换成一条Notification。统一了Android的事件广播模型
    2、 请介绍下Android中经常使用的五种布局。
    经常使用五种布局方式,各自是:FrameLayout(框架布局)。LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局)。TableLayout(表格布局)。


    一、FrameLayout:全部东西依次都放在左上角,会重叠。这个布局比較简单,也仅仅能放一点比較简单的东西。

    二、LinearLayout:线性布局,每个LinearLayout里面又可分为垂直布局(android:orientation=”vertical”)和水平布局(android:orientation=”horizontal” )。当垂直布局时,每一行就仅仅有一个元素,多个元素依次垂直往下;水平布局时,仅仅有一行,每个元素依次向右排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置。这种布局方式也比較简单,可是在屏幕旋转时。往往会出问题。而且多个元素的时候,计算比較麻烦。

    四、RelativeLayout:相对布局能够理解为某一个元素为參照物。来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、 android:layout_toLeftOf相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局。每个TableLayout里面有表格行TableRow。TableRow里面能够详细定义每个元素。

    每个布局都有自己适合的方式。这五个布局元素能够相互嵌套应用,做出美观的界面。


    3、 android中的动画有哪几类,它们的特点和差别是什么
    答:两种。一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式能够使视图组件移动、放大、缩小以及产生透明度的变化;还有一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,相似电影。
    4、 android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和差别。
    答:XML解析主要有三种方式。SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要採用SAX方式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是非常方便。而DOM方式会把整个XML文件载入到内存中去。这里Android开发网提醒大家该方法在查找方面能够和XPath非常好的结合假设数据量不是非常大推荐使用。而PULL经常常使用在J2ME对于节点处理比較好。相似SAX方式,同样非常节省内存。在J2ME中我们经常使用的KXML库来解析。
    5、 ListView的优化方案
    答:1、假设自己定义适配器,那么在getView方法中要考虑方法传进来的參数contentView是否为null。假设为null就创建contentView并返回,假设不为null则直接使用。在这种方法中尽可能少创建view。


    2、给contentView设置tag(setTag())。传入一个viewHolder对象,用于缓存要显示的数据,能够达到图像数据异步载入的效果。
    3、假设listview须要显示的item非常多,就要考虑分页载入。比方一共要显示100条或者很多其他的时候,我们能够考虑先载入20条,等用户拉到列表底部的时候再去载入接下来的20条。
    6、 请介绍下Android的数据存储方式。


    答:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据。使用ContentProvider存储数据。网络存储数据。
    Preference,File, DataBase这三种方式分别相应的文件夹是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。


    一:使用SharedPreferences存储数据
    首先说明SharedPreferences存储方式。它是 Android提供的用来存储一些简单配置信息的一种机制,比如:登录用户的username与password。

    其採用了Map数据结构来存储数据,以键值的方式存储。能够简单的读取与写入,详细实比例如以下:
    void ReadSharedPreferences(){
    String strName,strPassword;
    SharedPreferences user = getSharedPreferences(“user_info”,0);
    strName = user.getString(“NAME”,””);
    strPassword = user getString(“PASSWORD”,””);
    }
    void WriteSharedPreferences(String strName,String strPassword){
    SharedPreferences user = getSharedPreferences(“user_info”,0);
    uer.edit();
    user.putString(“NAME”, strName);
    user.putString(“PASSWORD” ,strPassword);
    user.commit();
    }
    数据读取与写入的方法都非常easy,仅仅是在写入的时候有些差别:先调用edit()使其处于编辑状态,然后才干改动数据,最后使用commit()提交改动的数据。

    实际上SharedPreferences是採用了XML格式将数据存储到设备中。在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:仅仅能在同一个包内使用。不能在不同的包之间使用。
    二:文件存储数据
    文件存储方式是一种较经常使用的方法。在Android中读取/写入文件的方法,与 Java中实现I/O的程序是全然一样的。提供了openFileInput()和openFileOutput()方法来读取设备上的文件。

    详细实比例如以下:
    String fn = “moandroid.log”;
    FileInputStream fis = openFileInput(fn);
    FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
    三:网络存储数据
    网络存储方式,须要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。


    四:ContentProvider
    1、ContentProvider简单介绍
    当应用继承ContentProvider类。并重写该类用于提供数据和存储数据的方法。就能够向其他应用共享其数据。

    虽然使用其他方法也能够对外共享数据。但数据訪问方式会因数据存储的方式而不同,如:採用文件方式对外共享数据,须要进行文件操作读写数据。採用sharedpreferences共享数据,须要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的优点是统一了数据訪问方式。
    2、Uri类简单介绍
    Uri代表了要操作的数据。Uri主要包括了两部分信息:1.须要操作的ContentProvider 。2.对ContentProvider中的什么数据进行操作。一个Uri由以下几部分组成:
    1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://…
    2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者能够依据这个标识来找到它。
    3.路径(path):能够用来表示我们要操作的数据,路径的构建应依据业务而定,例如以下:
    要操作contact表中id为10的记录,能够构建这种路径:/contact/10
    要操作contact表中id为10的记录的name字段, contact/10/name
    要操作contact表中的全部记录,能够构建这种路径:/contact?
    要操作的数据不一定来自数据库,也能够是文件等他存储方式,例如以下:
    要操作xml文件里contact节点下的name节点,能够构建这种路径:/contact/name
    假设要把一个字符串转换成Uri,能够使用Uri类中的parse()方法。例如以下:
    Uri uri = Uri.parse(“content://com.changcheng.provider.contactprovider/contact”)
    3、UriMatcher、ContentUrist和ContentResolver简单介绍
    由于Uri代表了要操作的数据,所以我们非常经常须要解析Uri,并从 Uri中获取数据。

    Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用。会便于我们的开发工作。
    UriMatcher:用于匹配Uri,它的使用方法例如以下:
    1.首先把你须要匹配Uri路径全部给注冊上。例如以下:
    //常量UriMatcher.NO_MATCH表示不匹配不论什么路径的返回码(-1)。


    UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    //假设match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1
    uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//加入须要匹配uri。假设匹配就会返回匹配码
    //假设match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
    uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
    2.注冊完须要匹配的Uri后。就能够使用uriMatcher.match(uri)方法对输入的Uri进行匹配,假设匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个參数。假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。
    ContentUris:用于获取Uri路径后面的ID部分。它有两个比較实用的方法:
    withAppendedId(uri, id)用于为路径加上ID部分
    parseId(uri)方法用于从路径中获取ID部分
    ContentResolver:当外部应用须要对ContentProvider中的数据进行加入、删除、改动和查询操作时。能够使用 ContentResolver 类来完毕,要获取ContentResolver 对象。能够使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法。来操作数据。
    7、 activity的启动模式有哪些?是什么含义?
    答:在android里。有4种activity的启动模式,分别为:
    “standard” (默认)
    “singleTop”
    “singleTask”
    “singleInstance”
    它们主要有例如以下不同:
    1. 怎样决定所属task
    “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括參数FLAG_ACTIVITY_NEW_TASK。
    假设提供了FLAG_ACTIVITY_NEW_TASK參数。会启动到别的task里。
    “singleTask”和”singleInstance”总是把activity作为一个task的根元素。他们不会被启动到一个其他task里。
    2. 是否同意多个实例
    “standard”和”singleTop”能够被实例化多次,而且存在于不同的task中,且一个task能够包括一个activity的多个实例;
    “singleTask”和”singleInstance”则限制仅仅生成一个实例。而且是task的根元素。 singleTop要求假设创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
    3. 是否同意其他activity存在于本task内
    “singleInstance”独占一个task,其他activity不能存在那个task里;假设它启动了一个新的activity。无论新的activity的launch mode 怎样,新的activity都将会到别的task里执行(如同加了FLAG_ACTIVITY_NEW_TASK參数)。
    而另外三种模式,则能够和其他activity共存。


    4. 是否每次都生成新实例
    “standard”对于没一个启动Intent都会生成一个activity的新实例。
    “singleTop”的activity假设在task的栈顶的话,则不生成新的该activity的实例。直接使用栈顶的实例。否则,生成该activity的实例。


    比方如今task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,假设D是 “standard”的,则生成D的一个新实例。栈变为A-B-C-D-D。
    假设D是singleTop的话。则不会生产D的新实例,栈状态仍为A-B-C-D
    假设这时候给B发Intent的话。无论B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
    “singleInstance”是其所在栈的唯一activity。它会每次都被重用。
    “singleTask”假设在栈顶,则接受intent,否则,该intent会被丢弃,可是该task仍会回到前台。


    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 假设收到intent生成一个activity实例,那么用户能够通过back键回到上一个状态。假设是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
    8、 跟activity和Task 有关的 Intent启动方式有哪些?其含义?
    核心的Intent Flag有:
    FLAG_ACTIVITY_NEW_TASK
    FLAG_ACTIVITY_CLEAR_TOP
    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    FLAG_ACTIVITY_SINGLE_TOP
    FLAG_ACTIVITY_NEW_TASK
    假设设置,这个Activity会成为历史stack中一个新Task的開始。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户能够迁移的Activity原子组。

    Task能够移动到前台和后台;在某个特定Task中的全部Activity总是保持同样的次序。
    这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列能够单独完毕的事情,与启动它们的Activity全然无关。
    使用这个标志。假设正在启动的Activity的Task已经在执行的话。那么,新的Activity将不会启动;取代的。当前Task会简单的移入前台。

    參考FLAG_ACTIVITY_MULTIPLE_TASK标志,能够禁用这一行为。
    这个标志不能用于调用方对已经启动的Activity请求结果。
    FLAG_ACTIVITY_CLEAR_TOP
    假设设置,而且这个Activity已经在当前的Task中执行,因此。不再是又一次启动一个这个Activity的实例,而是在这个Activity上方的全部Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(如今位于顶端)中。
    比如,假设一个Task中包括这些Activity:A。B,C,D。假设D调用了startActivity()。而且包括一个指向Activity B的Intent,那么。C和D都将结束,然后B接收到这个Intent,因此,眼下stack的状况是:A。B。
    上例中正在执行的Activity B既能够在onNewIntent()中接收到这个新的Intent。也能够把自己关闭然后又一次启动来接收这个Intent。假设它的启动模式声明为 “multiple”(默认值)。而且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后又一次创建;对于其他的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。


    这个启动模式还能够与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity。它会把那个Task中不论什么执行的实例带入前台。然后清除它直到根Activity。

    这非常实用。比如,当从Notification Manager处启动一个Activity。


    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    假设设置这个标志。这个activity无论是从一个新的栈启动还是从已有栈推到栈顶。它都将以the front door of the task的方式启动。

    这就讲导致不论什么与应用相关的栈都讲重置到正常状态(无论是正在讲activity移入还是移除)。假设须要。或者直接重置该栈为初始状态。


    FLAG_ACTIVITY_SINGLE_TOP
    假设设置,当这个Activity位于历史stack的顶端执行时,不再启动一个新的
    FLAG_ACTIVITY_BROUGHT_TO_FRONT
    这个标志一般不是由程序代码设置的。如在launchMode中设置singleTask模式时系统帮你设定。
    FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
    假设设置。这将在Task的Activity stack中设置一个还原点,当Task恢复时。须要清理Activity。也就是说,下一次Task带着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重新启动它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们。可是能够回到之前的Activity。
    这在你的程序有切割点的时候非常实用。比如。一个e-mail应用程序可能有一个操作是查看一个附件。须要启动图片浏览Activity来显示。这个 Activity应该作为e-mail应用程序Task的一部分,由于这是用户在这个Task中触发的操作。

    然而,当用户离开这个Task。然后从主画面选择e-mail app。我们可能希望回到查看的会话中,但不是查看图片附件,由于这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其他启动的Activity在下次用户返回到mail程序时都将全部清除。
    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    假设设置,新的Activity不会在近期启动的Activity的列表中保存。
    FLAG_ACTIVITY_FORWARD_RESULT
    假设设置,而且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity能够调用setResult(int)。而且这个结果值将发送给那个作为答复目标的 Activity。


    FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    这个标志一般不由应用程序代码设置,假设这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
    FLAG_ACTIVITY_MULTIPLE_TASK
    不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,能够禁用把已存的Task送入前台的行为。

    当设置时,新的Task总是会启动来处理Intent。而无论这是是否已经有一个Task能够处理同样的事情。
    由于默认的系统不包括图形Task管理功能。因此,你不应该使用这个标志,除非你提供给用户一种方式能够返回到已经启动的Task。
    假设FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。
    FLAG_ACTIVITY_NO_ANIMATION
    假设在Intent中设置,并传递给Context.startActivity()的话。这个标志将阻止系统进入下一个Activity时应用 Acitivity迁移动画。

    这并不意味着动画将永不执行——假设还有一个Activity在启动显示之前,没有指定这个标志。那么,动画将被应用。这个标志能够非常好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。


    FLAG_ACTIVITY_NO_HISTORY
    假设设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也能够通过设置noHistory特性。
    FLAG_ACTIVITY_NO_USER_ACTION
    假设设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。
    典型的。一个Activity能够依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
    假设一个Activity通过非用户驱动的事件,如来电或闹钟。启动的。这个标志也应该传递给Context.startActivity,保证暂停的Activity不觉得用户已经知晓其Notification。


    FLAG_ACTIVITY_PREVIOUS_IS_TOP
    If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
    FLAG_ACTIVITY_REORDER_TO_FRONT
    假设在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经执行的Activity移动到历史stack的顶端。
    比如。假设一个Task由四个Activity组成:A,B,C,D。

    假设D调用startActivity()来启动Activity B。那么,B会移动到历史stack的顶端。如今的次序变成A,C,D,B。

    假设FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。


    9、 请描写叙述下Activity的生命周期。
    答:activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();
    可见生命周期:从onStart()直到系统调用onStop()
    前台生命周期:从onResume()直到系统调用onPause()
    10、 activity在屏幕旋转时的生命周期
    答:不设置Activity的android:configChanges时。切屏会又一次调用各个生命周期。切横屏时会执行一次。切竖屏时会执行两次;设置Activity的android:configChanges=”orientation”时,切屏还是会又一次调用各个生命周期,切横、竖屏时仅仅会执行一次;设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会又一次调用各个生命周期,仅仅会执行onConfigurationChanged方法
    11、 怎样启用Service,怎样停用Service。
    服务的开发比較简单。例如以下:
    第一步:继承Service类
    public class SMSService extends Service {}
    第二步:在AndroidManifest.xml文件里的节点里对服务进行配置:
    服务不能自己执行,须要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都能够启动Service,可是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了。服务仍然执行。

    使用bindService()方法启用服务。调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。大有“不求同一时候生,必须同一时候死”的特点。


    假设打算採用Context.startService()方法启动服务,在服务未被创建时。系统会先调用服务的onCreate()方法。接着调用onStart()方法。假设调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

    採用startService()方法启动的服务,仅仅能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
    假设打算採用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法。接着调用onBind()方法。

    这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法。接着调用onDestroy()方法。假设调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

    假设调用者希望与正在绑定的服务解除绑定。能够调用unbindService()方法。调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。
    服务经常使用生命周期回调方法例如以下:
    onCreate() 该方法在服务被创建时调用,该方法仅仅会被调用一次,无论调用多少次startService()或bindService()方法,服务也仅仅被创建一次。


    onDestroy()该方法在服务被终止时调用。


    与採用Context.startService()方法启动服务有关的生命周期方法
    onStart() 仅仅有採用Context.startService()方法启动服务时才会回调该方法。该方法在服务開始执行时被调用。多次调用startService()方法虽然不会多次创建服务,但onStart() 方法会被多次调用。
    与採用Context.bindService()方法启动服务有关的生命周期方法
    onBind()仅仅有採用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。


    onUnbind()仅仅有採用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用
    12、 注冊广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。
    答:首先写一个类要继承BroadcastReceiver
    第一种:在清单文件里声明,加入


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    AI Dropout
    笔记2 区块链
    Visual Studio的下载安装
    第48课 thinkphp5添加商品库
    一个手机号可以注册绑定5个百度网盘,永久2T
    第39-43课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)
    第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)
    php中 为什么验证码 必须要开启 ob_clean 才可以显示
    网站同一用户只能在同一个地方登录
    微信小程序第3课 目录结构及小知识点
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4913127.html
Copyright © 2011-2022 走看看