Android常见问题总结(一)

RosMesser 9年前
   <p>以下为一些常见的Android的总结:</p>    <p> </p>    <p> </p>    <h2>1. Activity与Fragment的生命周期</h2>    <p>Activity的生命周期如下图所示:</p>    <p><img alt="Activity生命周期" src="https://simg.open-open.com/show/18b672541d6e54580862c441df94e663.jpg"></p>    <p> </p>    <p>Fragment生命周期如下图所示:</p>    <p><img alt="Fragment生命周期" src="https://simg.open-open.com/show/c385000958f0198f2e6e93d7f275020b.jpg"></p>    <p> </p>    <h2>2. Acitivty的四种启动模式与特点</h2>    <p>Android中的Activity由任务栈管理,当我们start一个新的Activity时,就往任务栈中新加入一个栈帧,而当我们finish一个Activity界面时,则往任务栈中移除一个栈帧。Activity具有四种启动模式,我们可以在配置文件中通过修改launchMode修改,启动模式分别是:standard、singleTop、singleTask和singleInstance</p>    <h3>standard</h3>    <p>standard为默认Activity的启动模式。在standard启动模式下,无论何时start一个Activity,系统都会往任务栈中加入一个新的栈帧。</p>    <p> </p>    <h3>singleTop</h3>    <p>在singleTop启动模式下,当我们start一个Activity时,系统会先去检测任务栈栈顶的Activity和要启动t的Activity是否相同。如果相同则不进行任何操作,否则往任务栈中加入一个新的栈帧。</p>    <p> </p>    <h3>singleTask</h3>    <p>在singleTask启动模式下,当我们start一个Activity时,系统会先去检测任务栈中是否含有将要启动的Activity。如果含有,则把该Activity所在栈帧的顶部的栈帧移除,使该Activity所在的栈帧处在栈顶,如果没有,则新加入一个栈帧。</p>    <p> </p>    <h3>singleInstance</h3>    <p>在singleInstance启动模式下,当我们start一个新的Activity时,该Activity会在一个新的任务栈中启动。</p>    <p> </p>    <h2>3. Service的生命周期,两种启动方法,有什么区别</h2>    <p>Android中的Service组件可以通过startService和bindService两种方法来启动,其生命周期示意图如下:</p>    <p> </p>    <p><span style="color:#333333"><img alt="Service生命周期" src="https://simg.open-open.com/show/284c641e8ededa9681c0d22da94af6c3.png"></span></p>    <p> </p>    <p><span style="color:#333333">如果一个Service同时被调用了startService和bindService方法,那么它的生命周期就变成如下图所示:</span></p>    <p><span style="color:#333333"><img alt="Service生命周期2" src="https://simg.open-open.com/show/016a104198c222b3c2d39e919a44e06b.png"></span></p>    <p> </p>    <h2>4. 怎么保证service不被杀死</h2>    <p>要想使Service存活下来,我们就必须保证Service所在的进程不被杀掉,一般来说有以下方法:</p>    <ol>     <li>在onStartCommand回调方法中返回START_STICKY,那么该进程被杀掉后系统会试图重启它</li>     <li>设置配置文件中application的persistent属性,把应用提升为系统级别应用,免疫low memory killer</li>     <li>在Service的onDestroy方法中重启该Service,不过如果进程被直接杀掉这种方法就无效了</li>     <li>通过监听特殊的系统广播(如屏幕变化、电量变化、网络变化等)去不断重启Service</li>     <li>使用AlarmManager定时重复开启Service</li>     <li>通过设置Service的process属性,把Service放在子进程中,避免与主进程一起被回收</li>     <li>开启一个另外的进程与Service进程互相监视,双方要是有任意一方被杀掉则重启</li>    </ol>    <p>来自: <a href="/misc/goto?guid=4959672196694424460" rel="nofollow">http://blog.csdn.net/superxlcr/article/details/51213434</a></p>