Android知识点

1、横竖屏切换时候Activity的生命周期

①不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,且竖屏时会执行两次

②设置activity的android:configChanges=”orientation”时,切屏还是会调用各个生命周期,切横屏,竖屏时只会执行一次

③设置activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结一下整个Activity的生命周期补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop       onRestart -->onStart--->onResumeActivity未被完全覆盖只是失去焦点:onPause--->onResume

2、如何将一个Activity设置成窗口的样式。

Activity属性设定做法有两种
方法1.AndroidManifest.xml文件当中设置当前activity的一个属性(系统自带的属性): android:theme="@android:style/Theme.Dialog"

`
方法2.
在styles.xml文件中可以新建一如下的style:


@drawable/float_box

    如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):    <?xml version="1.0" encoding="utf-8"?>    <shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="#ffffff" />    <stroke android:width="3dp" color="#000000" />    <corners android:radius="3dp" />    <padding android:left="10dp" android:top="10dp"  android:right="10dp" android:bottom="10dp" />    </shape>在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity" 即可

3、后台的Activity被系统回收怎么办?

onSaveInstanceState         public void onSaveInstanceState(Bundle outState) {          super.onSaveInstanceState(outState);          outState.putLong("id", 1234567890);          }          if(savedInstanceState != null){           long id = savedInstanceState.getLong("id");          }          if(savedInstanceState != null){                 long id = savedInstanceState.getLong("id");            } 
被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。 savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

4、如何退出Activity?如何安全退出已调用多个Activity的Application?

对于单一Activity的应用来说,退出很简单,直接finish()即可。也可以用killProcess()和System.exit()这样的方法。

对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出。
2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。

系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
需要权限android.permission.FORCE_STOP_PACKAGES。
需要添加android:sharedUserId=”android.uid.system”属性
但,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。
以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。

5、两个Activity之间怎么传递数据?

由MainActivity 通过最简单的Intent.putExtra方法,将参数传入,也可以用Bundle传入参数,

    Bundle bundle = new Bundle();      bundle.putString("str", "Intent Demo");    intent.putExtras(bundle);

若需要获得返回值,则用startActivityForResult(),并需要知道返回的一个RESULT_CODE(int类型),可以理解为指针,用intent.setClass() 确定传递给那个类(这里包括Activity、Service等)。

第二个Activity
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String str=bundle.getString(“str”);
获得前一个Activity传来的参数,这里还需要返回给MainActivity参数,用到了setResult(RESULT_CODE, intent);
要说明的是RESULT_CODE必须与前一个Activity一致,否则就不能正常返回。
而第一个MainActivity通过重写onActivityResult()来取得相应的返回值。

若不需要返回,可以直接用startActivity()。

6、在启动一个Activity时就启动一个service

启动一个Activity时就启动一个service
在activity的onCreate里写
startService(xxx);
然后this.finish();结束自己..
这是最简单的方法 可能会有屏幕一闪的现象,如果UI要求严格的话用AIDL

根据service与activity的生命周期,选择在onCreate或onResume中startService;要记得stopService.

如何在一个Service中启动一个Activity
Intent intent = new Intent(Service.this,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

7、在同一个程序,但不同的activity中是否可以放在不同的Task任务栈中?

可以放在不同的Task中。
需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记

怎么在启动一个activity时就启动一个service
将启动的service的语句放在onCreate()方法中。

8、Activity怎么和Service绑定,怎么在activity中启动自己对应的Service

Activity能进行绑定得益于Service的接口。在实现Service必须实现onBind方法
Service和Activity的连接可以用ServiceConnection来实现。
在实现一个新ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。
执行绑定,调用bindServcie方法,传入一个选择了要绑定的Service的Intent和一个实现了的ServiceConnection实例

9、什么是Service以及描述下它的生命周期

Service是运行在后台的android组件,没有用户界面,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。
Service随着启动形式的不同,其生命周期稍有差别。当用Context.startService()来启动时,Service的生命周期依次为:oncreate——>onStartCommand——>onDestroy 当用Context.bindService()启动时:onStart——>onBind——>onUnbind——>onDestroy

10、Service有哪些启动方法,有什么区别,怎么停用Service?

Service启动方式有两种;一是Context.startService和Context.bindService。
区别是通过startService启动时Service组件和应用程序没多大的联系;当用访问者启动之后,如果访问者不主动关闭,Service就不会关闭,Service组件之间

因为没什么关联,所以Service也不能和应用程序进行数据交互。
而通过bindService进行绑定时,应用程序可以通过ServiceConnection进行数据交互。
在实现Service时重写的onBind方法中,其返回的对象会传给ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)中的service参数;
也就是说获取了serivce这个参数就得到了Serivce组件返回的值。
Context.bindService(Intent intent,ServiceConnection conn,int flag)其中只要与Service连接成功conn就会调用其onServiceConnected方法停用Service使用Context.stopService

11、不用Service,B页面为音乐播放,从A跳到B,再返回,如何使音乐继续播放?

A使用startActivityForResult方法开启B,B类结束时调用finish;A类的Intent有一个子Activity结束事件onActivityResult,在这个事件里继续播放音乐。

12、什么是IntentService?有何有点?

IntentService也是一个Service,是Service的子类;
IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑的阻塞的问题
优点:Activity的进程,当处理Intent的时候,会产生一个对应的Service,Android的进程处理器现在会尽可能的不kill掉你。

13、什么时候使用Service?

比如播放多媒体的时候用户启动了其他的Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,在或者在后台记录你地理位置的改变等等

14、说说Activity、Intent、Service是什么关系

一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承来的,Activity类显示有视图控件组成的用户接口,并对视图控件的事件做出响应。

Intent的调用是用来进行架构屏幕之间的切换的。
Intent是描述应用想要做什么。
Intent数据结果中最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。需要通过某一个Activity或其他Context对象来调用。
Activity\跳转到Activity,Activtiy启动Service,Service打开Activity都需要Intent表明跳转的意图,以及传递参数,Intent是这些组件间信号传递的传承者。

15、请介绍ContentProvider是如何实现数据共享的

ContentProvider是通过提供Uri来实现数据共享

16、请介绍下android的数据存储方式

Android提供了5种方式存储数据        使用SharedPreferences存储数据;        文件存储数据;        SQLite数据库存储数据        使用ContentProvider存储数据;        网络存储数据

17、android中常用的五种布局

线性布局LineayLayout、相对布局RelativeLayout、帧布局FrameLayout、表格布局TablElAYOUT,绝对布局AbsoluteLayout。

18、谈谈UI中,Padding和Margin有什么区别?

 Padding是文字相对于边框,而Margin是边框相对于父窗体

19、请解释一下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

子线程借用主线程里面的handler发送一条消息,这个消息会被线程放入消息队列里面,也就是message queue,

主线程里面有一个轮询器looper会发现消息队列里面有一条消息时,会调用handler消息处理执行handlermessage的方法去处理这个消息,这个handlemessage的方法可以更新ui控件内容了

20、AIDL的全称是什么?如何工作?能处理哪些类型的数据?

ADIL是一种接口定义语言,用于约束两个进程之间的通信规则,供编译器生成代码,实现android设备之间的进程通信。

进程之间的通信信息首先会被转换成AIDL协议消息,然后发送给对方,对方受到AIDL协议消息后在转换成相应的对象。AIDL支持类型包括java基础类型和String,List,Map,CharSequence,如果使用自定类型,必须实现Parcelable接口

更多相关文章

  1. android解析xml文档的各种方法
  2. android屏幕旋转时,Activity不重新调用onCreate的方法
  3. Android横竖屏切换的解决方法
  4. Android客户端向服务器端发送数据的流程(1)
  5. Android 解决65535的限制(官网推荐方法)
  6. 最新下载 android 源码方法
  7. Android的数据存储之一------SharedPreferences

随机推荐

  1. Android(安卓)Studio 快捷键
  2. Android(安卓)核心分析 之七------Servic
  3. GestureOverlayView
  4. Android之ConstraintLayout(依赖约束)布
  5. Android图形系统的分析与移植 -- 二、And
  6. android 获取http网络图片保存png
  7. android 汉字转拼音 笔记
  8. ScrollView实现界面自动滚动
  9. 使用IntelliJ IDEA 编译Android(安卓)JNI
  10. Android(安卓)UI开发第二十八篇——Fragm