android的动画有哪几种?他们的特点和区别是什么?
答:两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
handler进制的原理:
答:android提供了handler和looper来满足线程间的通信。Handler先进先出原则。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以产生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以构造一个handler对象来与looper沟通,以便push新消息到messagequeue里;或者接收looper(从messagequeue里取出)所送来的消息。
3)messagequeue:用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而android启动程序时会为它建立一个message queue.
Activity的生命周期:
答:onCreate: 在这里创建界面,做一些数据 的初始化工作
onStart: 到这一步变成用户可见不可交互的
onResume:变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉
o设备横竖屏切换的时候,接下来会发生什么?
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
Android启动Service的两种方式是什么?
startService:生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行
bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy
谈谈你对Android中Context的理解?
Context:包含上下文信息(外部值) 的一个参数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context.
它描述的是一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等
.请介绍下AsyncTask的内部实现,适用的场景是?
AsyncTask内部也是Handler机制来完成的,只不过Android提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以AsyncTask只应该用来执行耗时时间较短的任务,比如HTTP请求,大规模的下载和数据库的更改不适用于AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生AsyncTask根本执行不了的问题。
谈谈你对binder机制的理解?
binder是一种IPC机制,进程间通讯的一种工具. Java层可以利用aidl工具来实现相应的接口.
11.Android中进程间通信有哪些实现方式? Intent,Binder(AIDL),Messenger,BroadcastReceiver
介绍下实现一个自定义view的基本流程
1、自定义View的属性 编写attr.xml文件
2、在layout布局文件中引用,同时引用命名空间
3、在View的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到attr.xml文件值)
4、重写onMesure
5、重写onDraw
Android多线程的实现方式有哪些?
Thread & AsyncTask
Thread 可以与Loop 和 Handler 共用建立消息处理队列
AsyncTask 可以作为线程池并行处理多任务
android 中线程与线程,进程与进程之间如何通信
1 、一个 Android 程序开始运行时,会单独启动一个 Process 。
默认情况下,所有这个程序中的 Activity 或者 Service 都会跑在这个 Process 。
默认情况下,一个 Android 程序也只有一个 Process ,但一个 Process 下却可以有许多个 Thread。
ndroid中五种数据存储方式分别是什么?他们的特点?
Android提供了五种存取数据的方式
(1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使 用,生成XML的格式存放在设备中
2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库
(3) File文件,通过读取写入方式生成文件存放数据
4) ContentProvider,主要用于让其他应用程序使用保存的数据
(5)通过网络获取数据和写入数据到网络存储空间
请介绍下ContentProvider是如何实现数据共享的。
创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中前提是有相同数据类型并且有写入Content provider的权限。
注册广播有几种方式,这些方式有何优缺点?
ndroid广播机制(两种注册方法)
一种是代码动态注册
一种是在AndroidManifest.xml中配置广播
两种注册类型的区别是:
1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
请解释下Android程序运行时权限与文件系统权限的区别。
运行时权限Dalvik( android授权)
文件系统 linux 内核授权
系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
请说明原由。通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性
Android事件分发机制
Android中与事件分发相关的方法主要包括dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法,而事件分发一般会经过三种容器,分别为Activity、ViewGroup、View。下表对这三种容器分别拥有的事件分发相关方法进行了整理。
* 分发: dispatchTouchEvent如果返回true,则表示在当前View或者其子View(子子...View)中,找到了处理事件的View;反之,则表示没有寻找到
* 拦截: onInterceptTouchEvent如果返回true,则表示这个事件由当前View进行处理,不管处理结果如何,都不会再向子View传递这个事件;反之,则表示当前View不主动处理这个事件,除非他的子View返回的事件分发结果为false
* 消费: onTouchEvent如果返回true,则表示当前View就是事件传递的终点;反之,则表示当前View不是事件传递的终点
深入浅出反射
什么是反射?
反射是一种能够在程序运行时动态访问、修改某个类中任意属性(状态)和方法(行为)的机制(包括private实例和方法),java反射机制提供了以下几个功能:
* 在运行时判断任意一个对象所属的类;
* 在运行时构造任意一个类的对象;
* 在运行时判断任意一个类所具有的成员变量和方法;
* 在运行时调用任意一个对象的方法。
反射涉及到四个核心类:
* java.lang.Class.java:类对象
* java.lang.reflect.Constructor.java:类的构造器对象;
* java.lang.reflect.Method.java:类的方法对象;
* java.lang.reflect.Field.java:类的属性对象;
反射有什么用?
* 操作因访问权限限制的属性和方法;
* 实现自定义注解;
* 动态加载第三方jar包,解决android开发中方法数不能超过65536个的问题;
* 按需加载类,节省编译和初始化APK的时间;
反射工作原理
当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件,这些Class对象承载了这个类的所有信息,包括父类、接口、构造函数、方法、属性等,这些class文件在程序运行时会被ClassLoader加载到虚拟机中。当一个类被加载以后,Java虚拟机就会在内存中自动产生一个Class对象。我们通过new的形式创建对象实际上就是通过这些Class来创建,只是这个过程对于我们是不透明的而已。
反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运行时动态访问和修改任何类的行为和状态。
Java有几种基本数据类型?
a) byte,short,int,long,char,boolean,float,double
史上最精炼android四大组件基础总结(忘记了的可以过一遍)
Android基础知识总结
四大组件之一活动
活动状态
运行状态:活动处于栈顶
暂停状态:活动不处于栈顶,但仍然可见
停止状态:完全不可见
销毁状态:离开返回栈
生存期
onCreate()
onStart():不可见到可见调用
onResume():与用户进行交互,处于栈顶运行态
onPause():准备启动或者恢复另一活动,
onStop():完全不可见的时候调用
onDestory():被销毁之前调用,之后变为销毁状态
onRestart():这个方法由停止状态变为运行状态之前调用,也就是活动重新启动了
活动的启动模式
在配置文件Activity中配置launchMode属性
standard 默认每次启动一个新活动,它就会在返回栈中入栈,并处于栈顶位置。如果我们在一个Activity中跳转自己。点击两次创建之后,我们需连按三次Back建才能退出程序。
singleTop
解决了默认情况下,在栈顶还要创建不合理。也就是如果Activity处于栈顶不创建,不处于栈顶就会重新创建。
singleTask
解决一个栈中有多个Activity实例,也就是如果发现已经存在栈中就把这活动之上的统统出栈,没有则创建
singleInstance
指定为该模式的活动会启动一个新的返回栈来管理这个活动。
四大组件之二广播
标准广播:异步执行的广播
有序广播:同步执行的广播(对于广播接收器是有先后顺序)
接收系统广播
动态注册监听网络变化
在代码中注册为动态注册
在AndroidManifest.xml文件中注册时静态注册
四大组件之三服务
onCreate():在服务创建的时候调用
onStartCommand()方法会在每次服务启动的时候调用
onDestory()方法会在服务销毁的时候调用(回收不再使用的资源)
需要在AndroidManifest.xml文件中注册才能生效
启动和停止服务
主要也是借助Intent来实现的
启动服务
startService(new Intent(this,MyService.class))
停止服务
stopService(new Intent(this,MyService.class))
服务的生命周期
onCreate() 服务之前没有创建过就会先执行
onStartCommand()方法执行每次调用startService()就会执行。但是还是只存在一个实例
onBind():在Context的bindService()调用时就会执行该方法
onDestory(): 调用startService后再调用stopService()时就会执行,调用bindService 后又调用unbindService()也会执行
当调用了startService()又调用bindService()此时只有当两个同时调用stopService和unbindService().onDestory()才会执行。
内容提供器Content Provider
内容提供器简介
为了在应用程序之间交换数据,Android提供了ContentProvider,
ContentProvider是不同应用程序之间进行数据交换的标准API,
当一个应用程序需要把自己的数据暴露给其他程序使用时,
该应用程序就可通过提供ContentProvider来实现,其他应用程序可通过ContentResolver
来操作ContentProvider暴露的数据,
包括增加数据
删除数据
修改数据
查询数据等。
ContentProvider也是Android应用的四大组件之一,
需要在AndroidManifest.xml文件中进行配置.
在A应用编写ContentProvider,
在B应用
调用getContentResolver,获取resolver对象
调用insert(),delete(),update(),query(),传入URI实现数据访问