志在指尖
用双手敲打未来

android知识点总结

1.activity的生命周期
函数调用过程:
启动第一个Activity的时候:
第一次创建onCreate()–>Activity可见了onStart()–>Activity可以操作了onResume()。
点击第一个Activity上的按钮通过Intent跳到第二个Activity:
第一个Activity暂停onPause()–>创建第二个ActivityonCreate()–>Activity可见onStart()–>Activity可操作onResume()–>第一个Activity被第二个Activity完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
点击系统返回功能建,从第二个Activity回到第一个Activity:
第二个Activity暂停onPause()–>第一个Activity重启动OnRestart()(并没有被销毁,如果销毁了则要创建onCreate())–>第一个Activity可见onStart()–>第一个Activity可操作onResume()–>第二个Activity被完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。Android
2.android动画分类
tweenedanimation(补间动画)和frame-by-frameanimation(帧动画),一般我们用的是第一种。补间动画又分为AlphaAnimation,透明度转换RotateAnimation,旋转转换ScaleAnimation,缩放转换TranslateAnimation位置转换(移动)。
3.MessageQueue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列;线程:UIthread通常就是mainthread,而Android启动程序时会替它建立一个MessageQueue;andriod提供了Handler和Looper来满足线程间的通信;Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列);Handler先进先出原则,可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从MessageQueue取出)所送来的消息。
andler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Looper也把消息队列里的消息广播给所有的Handler:Handler接受到消息后调用handleMessage进行处理,
判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行!
1.当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;
2.Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。
4.默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个Thread;所有这个程序中的Activity、Service都会跑在这个Proces;一个Android程序开始运行时,就有一个主线程MainThread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UIThread;一个Android程序创建之初,一个Process呈现的是单线程模型–即MainThread,所有的任务都在一个线程中运行。所以,MainThread所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死现象);Android单线程模型:AndroidUI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。
5.sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,sim卡的EF文件就是作存储并和手机通讯用的。
6.如何将sqlite数据库文件a.db与apk一起发布?可以将a.db文件复制到EclipseAndroid工程中的res
raw目录,在resraw目录中的文件不会被压缩,这样可以直接提取该目录中的文件;Android中不能直接打开resraw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res
raw目录中资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在AndroidSDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
7.Android中MVC的具体体现:视图层(view):一般采用xml文件进行界面的描述,也可以使用javascript+html等的方式作为view层,当然需要进行java和javascript之间的通信。模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的;控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写业务代码,要通过activity交给model层做业务逻辑的处理,
android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。第一步:继承Service类publicclassSMSServiceextendsService{},第二步:在AndroidManifest.xml文件中的节点里对服务进行配置:,;Context.startService()或Context.bindService()方法启动服务。,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起。Context.startService()系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法,采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。onDestroy()该方法在服务被终止时调用。onStart()只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法onBind()被多次调用。
采用Context.bindService()方法启动服务的代码如下:publicclassHelloActivityextendsActivity{
ServiceConnectionconn=newServiceConnection(){
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
}
publicvoidonServiceDisconnected(ComponentNamename){
}
};
@Override
publicvoidonCreate(BundlesavedInstanceState){
Buttonbutton=(Button)this.findViewById(R.id.button);
button.setOnClickListener(newView.OnClickListener(){
publicvoidonClick(Viewv){
Intentintent=newIntent(HelloActivity.this,SMSService.class);
bindService(intent,conn,Context.BIND_AUTO_CREATE);
//unbindService(conn);//解除绑定
}});
}
}
8.px:表示屏幕实际的象素,in:表示英寸,是屏幕的物理尺寸,
dp是与密度无关,sp除了与密度无关外,还与scale无关,使用dp和sp,系统会根据屏幕密度的变化自动进行转换..
9.standard:标准模式,一调用startActivity()方法就会产生一个新的实例;
singleTop:如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。singleTask:会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。singleInstance:这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
10.androidintent:Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成.
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。
显示匹配(Explicit):
1.publicTestBextentsActivity
2.{
3……….
4.};
5.publicclassTestextendsActivity
6.{
7…….
8.publicvoidswitchActivity()
9.{
10.Intenti=newIntent(Test.this,TestB.class);
11.this.startActivity(i);
12.}
13.}
代码简洁明了,执行了switchActivity()函数,就会马上跳转到名为TestB的Activity中。
隐式匹配(Implicit):
首先要匹配Intent的几项值:Action,Category,Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。匹配规则为最大匹配规则.
11.当你的程序中某一个ActivityA在运行时中,主动或被动地运行另一个新的ActivityB,
这个时候A会执行publicvoidonSaveInstanceState(BundleoutState){
super.onSaveInstanceState(outState);
outState.putLong(“id”,1234567890);}
B完成以后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
if(savedInstanceState!=null){
longid=savedInstanceState.getLong(“id”);
}
12.对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。为了编程方便,最好定义一个Activity基类,处理这些共通问题:关闭多个activity.
13.Android提供了5种方式存储数据,(1)使用SharedPreferences存储数据,它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用.(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
14.Activity:活动,一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。Intent:意图,最重要的部分是动作和动作对应的数据。ContentProvider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
15.view是最基础的,必须在UI主线程内更新画面,速度较慢。SurfaceView是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快,
GLSurfaceView是SurfaceView的子类,opengl专用的。
16.(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
17.LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。我们可以通过设置android:gravity=”center”来让EditText中的文字在EditText组件中居中显示;同时我们设置EditText的android:layout_gravity=”right”来让EditText组件在LinearLayout中居右显示
18.注册广播接收者:首先写一个类要继承BroadcastReceiver
第一种:在清单文件中声明,添加
<receiveandroid:name=”.IncomingSMSReceiver”>
<intent-filter>
<actionandroid:name=”android.provider.Telephony.SMS_RECEIVED”)
<intent-filter>
第二种使用代码进行注册如:
IntentFilterfilter=newIntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiverreceiver=newIncomgSMSReceiver();
registerReceiver(receiver.filter);
1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。
19.双缓冲技术原理:创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去.要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。
20.AsyncTask我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(UI线程),在子线程中操作UI线程会出现错误.
android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户.时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题。因此android提供了一个工具类AsyncTask,顾名思义异步执行任务.不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。
21.Socket通信编程,
客户端编程步骤:
1、创建客户端套接字(指定服务器端IP地址与端口号)2、连接(Android创建Socket时会自动连接)3、与服务器端进行通信4、关闭套接字
服务器端:
1.创建一个ServerSocket,用于监听客户端Socket的连接请求
2.采用循环不断接受来自客户端的请求
3.每当接受到客户端Socket的请求,服务器端也对应产生一个Socket

未经允许不得转载:IT技术网站 » android知识点总结
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载