`
kerlubasola
  • 浏览: 673433 次
文章分类
社区版块
存档分类
最新评论

我的Android笔记

 
阅读更多

--总结:
2种启动Activity方法,4种Activity启动模式,2种启动服务方法,3种handler得到主线程消息队列,5种Activity主动退出,3个 dalvik优点,3中广播,5个进程等级,4个多线程和异步操作方法,5种数据储存,5种Activity传递值方式


LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。
进程间通信机制IPC,在Linux中,有命名管道(named pipe),消息队列(message queue),信号(signal),共享内存(share memoery),SOCKET等方式。Android中采用了Binder的机制:进程间同步调用,通过内存来提高性能,为进程请求分配每个进程的线程池。
Binder的实质就是把对象从一个进程映射到另一个进程中,而不管这个对象是本地的还是远程的。
Binder.java是Android应用框架里的重要组件,由于它提供了IBinder接口,让Activity等组件能透过IBinder接口而远程呼叫应用程序里的Service组件。


默认每个应用程序在自己的 Linux 进程中运行,当应用程序中的任何代码需要执行时android就启动一个的进程,当不再需要或系统资源被其他应用程序请求时android就关闭这个进程。 每个进程都有其专属的Java虚拟机(VM),所以应用程序代码运行时与其他的应用程序是彼此隔离的。
默认的,每个应用被赋予一个唯一的 Linux 用户 ID,由于权限设置的原因,一个应用程序的文件只有本用户(应用程序本身)可见——当然,也有把他们导出给其他应用程序的机制。 可以为两个应用程序安排使用同一个用户ID,这种情况下他们彼此之间是可以看见对方的 文件。为了节约系统资源,拥有相同ID 的应用也能被安排运行在一个相同的Linux 进程中, 共享同一个虚拟机。
Android一个核心特点就是一个应用程序能使用另一个应用程序的元素(在提供元素的应用程序允许的情况下)。为了实现这样的过程,系统必须在应用程序的任何部分被请求时启动这个程序的进程,实例化那部分Java对象。因此,和其他大多数系统不同的是,android应用程序没有一个单独的程序入口(例如:没有 main 函数) 。而是包含运行所需的必要组件,使得系统可以实例化对象。。。 所以四大组件就出现了。
Android 四大组件
1.activity 窗口界面
2.intent 传输启动 boradcast
3.service 数据处理
4.contentProvider 存储数据


ActivitManager
PackageManager
ContentProviders
LocationManager
NotificationManager
TelephoneyManager
ResourceManager
ViewSystem
WindowManager
--------------默认任务栈------------------------------------------------
一个task 里的所有Activity 作为一个整体运转。整个task(整个Activity 堆栈)可以被送到 前台或者被推到后台。假设一个正在运行的task 中有四个Activity——正在运行的Activity 下面有三个Activity,这时用户按下HOME 键,回到应用程序启动器然后运行新的应用程 序(实际上是一个新的 task ),那么当前的task 就退到后台,新开启的应用程序的 root Activity 此时就显示出来了;一段时间后,用户又回到应用程序启动器,又重新选择了之前 的那个应用程序(先前的那个task),那么先前的那个task 此时又回到了前台了,当用户按下BACK 键时,屏幕不是显示刚刚离开的新开启的那个应用程序的Activity,而是移除回到 前台的这个task 的栈顶Activity,将这个task 的下一个Activity 显示出来。
------------------------------------------------------------------------
Activity有四种加载模式:
一个应用就是一个栈,一个任务栈也可以有别的应用的activity。
standar 默认每次开新activity
singleTop (只关心栈顶)如果要打开的Activity,在栈顶有它的实例就不会创建,就公用;没有就创建新的。
singletask (任务栈只有一个),首先判断栈里有没有,有就公用;没有就创建新的activity实例放在栈顶,再点击, 如果是调用原来存在的activity就会被重用;之上的就会被销毁。 (onNewIntent())
singleInstance :一个应用调用另一个应用,调用的是另一个应用的activity; 任务栈之间的调用(onNewIntent())


可以通过flag_activity_clear 标记关闭调所有打开的activity


设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
<activity android:name="ActB" android:launchMode="singleTask"></activity>
Activity的加载模式受启动Activity的Intent对象中设置的 Flag和manifest文件中Activity的<activity>元素的特性值交互控制。下面是影响加载模式的一 些特性
核心的Intent Flag有:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
核心的<activity>特性有:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch。affinity 满足以下两种情况时起作用:一是当启动 Activity 的 Intent 对象
包含有 FLAG_ACTIVITY_NEW_TASK 标志时,二是当 Activity 的 allowTaskReparenting 属
性设置为“true”。
获取最大可用RAM 为 Runtime.getRuntime().maxMemory();


android:theme="@android:style/Theme.Dialog"
<activity android:name=".About"
android:label="@string/about_title"
android:theme="@android:style/Theme.Dialog" >
</activity>




andorid单元测试要在mainifest.xml中加入user-libary及同级
<uses-library android:name="android.test.run"/>
<instrumentation android:name="android.test.instrumentationTestRunner"
android:targetPackage="com.heima.androidJunit"
android:label="test for myapps"/>
SharedPrefences保存
android:numeric="integer" //设置属性只能输入文本框
SharedPreferences p = context.getSharedPreferencs(name,mode);
参数name: 默认保存在当前pakagename/shared_prefs目录下的xml文件 "wangs"
参数mode:Context.MODE_PRIVATE;
Edit e = p.edit(); //取得编辑器对象
e.putString("n",name); //放入参数
e.putInt('age',age);
e.commit();//把保存在内存中的数据回送到文件中。
------
SharedPreferences读取
public Map<String,String> getPrference()
SharedPreferences p = context.getSharedPreferencs(name,mode);
String name = p.getString("n",""); //取得原来的键值,没有就默认
Integer age = p.getInt("age",0);
map.put("name",name);
map.put("age",age);


imageButton的属性
android:scaleType="centerCrop" //由中间向外比例填充
GridView的属性horizontalSpacing='10px'间距
listSelector="@drawable/chose" //每一项的的背景


android:autoLink="all" 在Editview 中自动链接http
AppWidgetManager....


用游标查询,绑定到ListView
Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,
null, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
startManagingCursor(cursor);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, cursor,
new String[] { CallLog.Calls.NUMBER },
new int[] { android.R.id.text1 });
getListView().setOnItemLongClickListener(this);
setListAdapter(adapter);


mAlarmSender = PendingIntent.getService(context, 0, new Intent(context, RefreshDataService.class), 0);


当一个View使用了GONE隐藏后,在RelativeLayout中会影响相关View布局;
可以使用一个属性alignWithParentIfMissing,


requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性。参数是Window类中定义的常量。
一、枚举常量
1.DEFAULT_FEATURES:系统默认状态,一般不需要指定
2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定
3.FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时
4.FEATURE_INDETERMINATE_PROGRESS:不确定的进度
5.FEATURE_LEFT_ICON:标题栏左侧的图标
6.FEATURE_NO_TITLE:无标题
7.FEATURE_OPTIONS_PANEL:启用“选项面板”功能,默认已启用。
8.FEATURE_PROGRESS:进度指示器功能
9.FEATURE_RIGHT_ICON:标题栏右侧的图标
this.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
在上面代码后加:getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


一些常用的Action:
ACTION_CALL activity 启动一个电话.
ACTION_EDIT activity 显示用户编辑的数据.
ACTION_MAIN activity 作为 Task中第一个Activity 启动
ACTION_SYNC activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.


。intent类定义了许多 category 常数:
CATEGORY_BROWSABLE 目标 activity 可以使用浏览器来显示-例如图片或电
子邮件消息
CATEGORY_GADGET 该 activity 可以被包含在另外一个装载小工具的
activity 中
CATEGORY_HOME 该activity 显示主屏幕,也就是用户按下Home键看
到的界面
CATEGORY_LAUNCHER 该 activity 可以作为一个 Task 的第一个 activity,并
且列在应用程序启动器中
CATEGORY_PREFERENCE 该activity 是一个选项面板


启动应用程序无动画
getWindow().setWindowAnimations(0) ;
或myIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);


点击返回退出程序,重写onKeydown()
重写其onKeydown方法即可。贴一段代码吧:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {//拦截返回按钮事件
//do something...new alertdialog
}
return true;
}


android2.2中 android.os.Process.killProcess(android.os.Process.myPid())不起作用是
Intent startMain = new Intent(Intent.ACTION_MAIN);
  startMain.addCategory(Intent.CATEGORY_HOME);
  startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(startMain); System.exit(0);




/*
* 使用在 res/values/ attrs.xml 中的 <declare- styleable > 定义 的 Gallery 属性 .
*/
TypedArray
typed_array=context.obtainStyledAttributes(R.styleable. Gallery );
/* 取得 Gallery 属性的 Index id */
mGalleryItemBackground =typed_array.getResourceId(R.styleable. Gallery_andro
id_galleryItemBackground , 0);
/* 让对象的 styleable 属性能够反复使用 */
typed_array.recycle();


/* 重新设置图片的宽高 */
imageview.setScaleType(ImageView.ScaleType. FIT_XY );




android:numColumns="auto_fit" ,GridView的列数设置为自动
android:columnWidth="90dp",每列的宽度,也就是Item的宽度
android:stretchMode="columnWidth",缩放与列宽大小同步
android:verticalSpacing="10dp",两行之间的边距,如:行一(NO.0~NO.2)与行二(NO.3~NO.5)间距为10dp
android:horizontalSpacing="10dp",两列之间的边距。


进度条progressbar
style="?android:attr/progressBarStyleHorizontal"
●进度条分不确定(indeterminate=true)和确定(indeterminate=false)2种。
默认值是不确定(indeterminate=true)Android进度条。
●Android进度条有4种风格可以使用。
默认值是progressBarStyle。
设置成progressBarStyleSmall后,图标变小。 
设置成progressBarStyleLarge后,图标变大
设置成progressBarStyleHorizontal后,变成横向长方形。
●确定(indeterminate=false)进度条中的最大值的设定,调用setMax()方法。


内存优化,线程优化,媒体优化,和UI优化等等
优化的方案:
优化循环;
减少使用对象的数量;
减少网络传输数据缩短等待时间;
采用对象池技术,提高对象利用率;
局部使用基本数据类型代替对象,减少开支;
用简单的数值计算代替复杂的函数计算,节省处理时间;
1.优化:
需要时候才创建
String str="sss";
if(i=1){
list.add(str);
}
把String str="sss"放到条件里,需要时候才赋值
2.慎用异常,它对性能不利。
3.不要将数组声明为public static final


常见的内存泄漏:.
1.万恶的static,
2.线程惹的祸, remove
3.超级大胖子Bitmap:第一、及时的销毁,设置一定的采样率,巧妙的运用软引用(SoftRefrence)
4.行踪诡异的Cursor,Cursor的数据量特表,应该保证Cursor占用的内存被及时的释放掉
5.构造Adapter时,没有使用缓存的 convertView




service不是一个线程,如果真的在界面更新,界面会卡住阻塞,需要用多线程就不会,可以back.
多线程不要试图停止它,stopservice(),destory()了,还是在运行;等它自己运行完自动停止,当然调用interapter可以;不建议一般不会影响内存泄漏,LINUX机制,只是耗一点内存,也不费电(不操作),与windows不一样,windows慢的是硬盘I/O操作


@android:style/Theme_light.notitle 主题,没有标题
setRequestedOrientation(int requestOrientation);设置屏幕方向,ActivityInfo.SCREEN


/设置播放画面的固定大小
//svScreen.getHolder().setFixedSize(176,144);//设置分辨率
//下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
svScreen.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//为SurfaceHold设置回调函数
svScreen.getHolder().addCallback(new Callback(){




SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd-hh.mm.ss");
File f = new File("/sdcard/" + sdf.format(new Date()) + ".jpeg");


Frame布局,可以把按钮放在视频上
<Button android:layout_width="5dip"
android:layout_height="5dip"
android:background="#ffff0000"
android:layout_gravity="top|right"
android:layout_marginTop="10dip"
android:layout_marginRight="10dip"
android:visibility="gone"
android:id="@+id/btnState"
/>


发送广播sendBroadcast(intent);
在接收的时候通过判断intent参数判断自定义的action是否为发送过来的action---一个过滤参数
也可以获得intent过来的参数 intent.getStringExtra("");


Notification.setLatestEventInfo.设置消息时间
notifyManager.notify(); //启动提醒
广播,多个接受者可以接收一个广播;
还可以使用权限发送广播,
要定义权限,在声明使用权限。
指定接收者接收权限
sendOrderedBroadcast();
发送有序广播,就看接收着的级别谁高,谁就可以截取(或终止它,下一个接收着就收不到了)
Bundle b = getResultExtrax(true);就可以该更改广播信息


系统发送的一个粘性广播,后来注册的也能收到,,粘性广播(会驻留在周围,其他人可以通过它再来接收,有返回值意图) ,(保证发送的是粘性广播)注册的接受者如果是接收粘性广播,有返回值。--后期注册者都能收到。
Intents.getMessageFromIntent(intent);广播接收短信意图


 一、Bitmap转Drawable
  Bitmap bm=xxx; //xxx根据你的情况获取
  BitmapDrawable bd=BitmapDrawable(bm);
  Android开发网提示因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
  二、 Drawable转Bitmap
  转成Bitmap对象后,可以将Drawable对象通过Android的SK库存成一个字节输出流,最终还可以保存成为jpg和png的文件。
  Drawable d=xxx; //xxx根据自己的情况获取drawable
  BitmapDrawable bd = (BitmapDrawable) d;
  Bitmap bm = bd.getBitmap();
  最终bm就是我们需要的Bitmap对象了。


spinner绑定的数组为string.xml中配置的数组,setDropDownViewResource(r.item..);见API


GIF动画的原理就是逐帧播放,在Android中提供了AnimationDrawable类可以实现,


程序完全退出:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain); System.exit(0);
//不推荐:事实上他并不影响速度。相反加快了下次启动应用的速度
(每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存)---不会死机,确保了android的稳定性


textView自动判断输入是电话,网址或者EMAIL的方法----LINKIFY的应用
加属性android:autoLink="web|phone|email" 或
//增加事件响应
et.setOnKeyListener(new EditText.OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
tv.setText(et.getText());
//判断输入的类型是哪种,并与系统连接
Linkify.addLinks(tv, Linkify.WEB_URLS|
Linkify.EMAIL_ADDRESSES|Linkify.PHONE_NUMBERS);
return false;
}
});


菜单menu的孵化
MenuInflater inflater = getMenuInflater();
//设置menu界面为res/menu/menu.xml
inflater.inflate(R.menu.menu, menu);
animation.setFillAfter(true);//动画停留在结束的状态


求两个整数的百分比
int currentindex = 55;
int totalcount = 66;
NumberFormat nf = NumberFormat.getPercentInstance();
final String persent = nf.format(((float)currentindex/(float)totalcount));


1.getApplication();全局的


可以自己定义继承自application,在mainifest.xml里配置这个application.


2.menu菜单
getMenuInflater().inflate(R.menu.layout_menu, menu);
menu.findItem(R.id.absolute_menu_item).setIntent(new Intent(this, absolute_layout.class));


startActivity(item.getIntent());


3.PackageManager取出包相关的
getPackageInfo()
ApplicationInfo,
List<PackageInfo> packInfos = pm.getInstalledPacages(PacageManager.GET..);
遍历出ApplicationInfo,
ApplicationInfo.FLAG_SYSTEM//可以瓣断是否是系统应用


卸载应用程序
Uri packageuri = new Uri("package:"+pacagename);
Intent deleteintent = new Intent();
deleteintent.setAction(Intent.ACTION_DELETE);
deleteintent.setData(packageuri);
startActivity(intent);


4.Activity的title的设置,
一种做法是隐藏系统的title,在布局文件中加上去;
另一种是boolean flag = this.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);// 自定义的title
if(flag){
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
}
android:layout_marginRight="20px"
android:layout_marginTop="60px"
android:layout_alignParentRight="true"
margin与padding的区别:
android:layout_marginRight="20px" 它控件与父窗体的距离
android:paddingRight="130px" 离它自身所在的距离


5.自定义Toast :显示图片和文字
继承Toast
new Toast();
toast.setGravity(); //位置
toast.setDuration();


6.AlertDialog.Builder
builder.setItems(R.array.choice, new OnClickListener(){
switch(which){case0:}
});


7.AnimationSet set = new AnimationSet(this,false);


8.杀死进程
ActivityManager am;
am = getSystemService(ACTIVITY_SERVICE);
am.getProcessMemoryInfo(pid[]);
ActivityManager.MemoeryInfo把am.getMemoryInfo内存信息放到当前
ActivityManager.MemoryInfo outInfo= new MemoryInfo();
am.getMemoryInfo(outInfo);
am.getRunningAppProcesses()获得所有的app进程


9.Widgets开发
首先它是一个形状,<shape></shape> .xml文件,放在drawable里面
widget_layoutxml,布局文件
创建一个布局文件,widget_info.xml,这是一些更新信息
extends AppWidgetProvider




<meta-data>可以配置在activity,receiver,service等节点下
<meta-data android:name="wangs" android:vlaue="wangsname">
getActivity()
ActivityInfo info= getPackageManager().getActivityInfo(new ComponentName(this,MainActivity.class),PackageManager.GET_MATE_DATA);
info.meataData.getString("wangs");//键值对
<meta-data android:name="sourceid" android:source="@string/hello">
//也可以获取R文件的ID


Timer time = new Timer(true);//守护线程,主线程退出,它也退出


在Activity之间传递复杂类型
一、实现Parcelable接口
对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的,对于二进制数据,传递的参数为putExtra(String name, Parcelable value) ,比如Bitmap类就实现了Parcelable接口,如果需要在Activity中传递图片,可以直接用Bitmap类型,当然如果本身是Drawable你可以先转化为Bitmap,
同时Parcelable效率比标准的Java序列化更高,同时还被用作在AIDL中交换数据,所以掌握Parcelable这样的显示序列化技术,可以大幅提高数据交换性能。
二、使用全局单例模式
三、实现Serializable接口
如果你学习过传统的Java,则可以通过串行化技术,实现Serializable接口,其实这个原理和Parcelable差不多,均将自己的类转换为基本的类型比如说字节数组。在Android中不是很实用,这里不再赘述,在Intent中使用Intent putExtra(String name, Serializable value) 这个方法即可。




强制保持Android Activity状态:
这里可以通过在androidmanifest.xml中在需要保留的activity中添加android:alwaysRetainTaskStat="true" 这句即可,这里Android123还要提醒大家的是有时候你的应用可能会产生多个实例,你还可以在主Activity中加入android:launchMode="singleInstance" 来强制让系统仅运行一个实例。


Android缩略图类源代码:
Android 2.2开始新增的缩略图类ThumbnailUtils的主要方法是静态的,


1. 如何让你的应用优先安装到SD卡上?
从Android 2.2 SDK开始多出了一个属性在AndroidManifest.xml中,在manifest节点加入android:installLocation="preferExternal"即可,
2.如何防止Service被系统回收?
对于Service被系统回收,一般做法是通过提高优先级可以解决,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"
3. Android NDK本地应用效率提升方法
对于C/C++的应用,这里Android开发网提示按照C++的习惯,简单反复调用的函数可以声明为inline,尽量少用虚函数,C++ STL的Stream效率不是很高,vector的内存管理要考虑仅分配不释放问题,如果需要涉及和Java通讯,则JNI的执行开销比较大,同时IPC通讯方法在本地端使用IBinder比较高效,当然如果你的技术不是很过关,Socket也是可以的,也更规范些吧。


目前Android 2.3将支持更大的屏幕尺寸定义,开发者可以通过 <supports screens ... android:xlargeScreens="true"> 元素在你的 manifest files 中定义,新增的 xlarge 标记将支持更多的屏幕尺寸, 有关具体的使用方法
Android 2.3 新增 StorageManager 类支持 OBB (Opaque Binary Blob) 文件在 Android 2.3上开发恐惧创建和管理OBB文件将在2011年早期无法使用。
加入一些判断虚拟SD分区,Android123提示大家,类似三星i9000可能存在虚拟的SD路径,所以 isExternalStorageRemovable() 可以知道是否是一个物理的SD卡.


数据储存:
SharePreference;
Files;
SQLite3
ContentProvider
Netword
Activity之间数据传递 :
Bundle,sharedpreferenced ,把数据存放到文件里, /data/data/<包名> 目录, sdcard上. ,Application




Dalvik Android:虚拟机的名字,Dalvik虚拟机是一个只能解释执行dex文件的虚拟机,dex文件针对存储性能和内存管理进行了优化。 Dalvik虚拟机是基于寄存器的虚拟机,并且能够运行经过Dalvik自带的“dx”工具转换过的Java类。 虚拟机运行在兼容Posix的操作系统上,依赖于底层的功能(如线程和低级内存管理)。Dalvik的核心类库有意做得与Java标准版非常类似,但它明显更适合小型移动设备。


Activity构建view
要定制我们自己的UI控件,需要重载View类中的一些方法,以下表格列出View提供出来的,供重载的方法,这些方法不必都要重载,但至少要实现onDraw(android.graphics.Canvas)方法。
当你为一个 activty 添加一个可见的 view, 并且运行这个activty时,android通常情况下会自动按照下列顺序来触发view的相关事件
1. onAttachedToWindow
2. onMeasure
3. onSizeChanged
4. onLayout
5. onDraw
对于Android应用中的一个屏幕,Android屏幕元素是按层次结构来描述的。要将一个屏幕元素层次树绑定在一个屏幕上显示,Activity会调用它的 setContentView()方法并且传入这个层次树的根节点引用。当Activity被激活并且获得焦点时,系统会通知activity并且请求根节点去计算并绘制树,根节点就会请求它的子节点去绘制它们自己。
Android屏幕元素中每个树上的ViewGroup节点会负责绘制它的子节点。ViewGroup会计算它的有效空间,布局所有的子显示对象,并最终调用所有的子显示对象的 Draw()方法来绘制显示对象。各个子显示对象可以向父对象请求它们在布局中的大小和位置,但最终决定各个子显示对象的大小和位置的是父对象。


Activity各生命周期函数的作用
onCreate函数:注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的,然后调用上面那个用来初始化的函数初始化布局信息。
onStart函数:注册一些变量。这些变量必须在Android Activity类在前台的时候才能够被响应。
onResume函数:调用一些刷新UI的函数,每当Activity调用到这里时就要刷新一下UI各控件的状态。
onPause函数:一般是做一些变量控件ty马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整。
onStop函数:反注册在onStart函数中注册的变量。
onDestory函数:反注册在onCreate函数中注册的变量。


自定义控件有2中方法:
1.在已有的控件下重写相关方法来实现需求
2.继承View类或viewGroup类,来绘制所需的控件


Android中的性能优化
1> 避免创建不必要的对象
2> 如果方法用不到成员变量,可以把方法声明为static,性能会提高15%到20%
3> 避免使用getters/setters存取Field,可以把Field声明为public,直接访问。
4> static的变量如果不需要修改,应使用static final修饰符定义为常量。
5> 使用增强For循环语法 for( : )。
6> 私有内部类要访问外部类的Field或方法,可以把外部类的Field或方法声明为包访问权限
7> 合理利用浮点数,浮点数比整型慢两倍


Debug.startMethodTracing("mys");
Debug.stopMethodTracing();
//traceView采集数据性能测试,会在sdcard目录下产生一个文件,
traceview这个命令去分析它,find它检测到方法(小写),Inclusive 所花时间--定义变量和方法
用代码写可能比xml性能更优--但是维护性差


//打开一个数据库DB
SQLiteDatabase db = SQLiteDatabase.openDatabase(路径,factory,只读标记);


Service服务
onCreate() //该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService() 或bindService()方法,服务也只被创建一次。
onDestroy()//该方法在服务被终止时调用。
与采用Context.startService()方法启动服务有关的生命周期方法:
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
与采用Context.bindService()方法启动服务有关的生命周期方法:
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。


所有的安全性都是基于AndroidManifest.xml文件中涉及的<uses-permission id="android.permission.XXX" />这样的权限,对于敏感的API操作都需要 permission权限,如何允许这些权限是由用户来决定的,所以会出现弹出类似Windows Vista UAC这样的安全警告框,但仅仅会出现是否允许操作,不会影响用户体验,浪费Android开发人员的金钱,造成更繁琐的事情。
在底层Android安全机制是由Linux帐户控制列表ACL管理的,类似文件权限中,允许任何用户可以读写需要赋予777权限是一个道理。
Android 安全机制概述
Android 是一个权限分离的系统 。 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 java 层通过这种 sandbox 机制,都可以)达到隔离的目的 。 与此 同时, Android 还 在此基础上进行扩展,提供了 permission 机制,它主要是用来对 Application 可以执行的某些具体操作进行权限细分和访问控制,同时提供了 per-URI permission 机制,用来提供对某些特定的数据块进行 ad-hoc 方式的访问。


关于签名机制,其实分两个阶段。
包扫描阶段需要进行完整性和证书的验证。


TCP/IP 参考模型 四层
应用层 :FTP,Telnet,SMTP,http
传输层 :TCP,UDP
网络层 :IP ,ARP(Address Resolution Protocol)地址转换协议
接口层 : 对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
---OSI的七层参考模型: 底层:物理层:网线设备等


Dalvik基于寄存器,而JVM基于栈。,基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。


singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。
singleTask模式和后面的singleInstance模式都是只创建一个实例的。
当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance模式下的Activity单独在一个task栈中。这个栈只有一个Activity。


int sdk_Version = android.os.Build.VERSION.SDK_INT;
if (sdk_Version >= 8) {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
System.exit(0);
}


public class MyApp extends Application
{ private Bitmap mBitmap;
public Bitmap getBitmap()
{ return mBitmap;
} public void setBitmap(Bitmap bitmap)
{
this.mBitmap = bitmap;
}
} MyApp myApp = (MyApp)getApplication();
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
myApp.setBitmap(bitmap);


标志性的给它一个tag,表明它的子控件
ImageView old = (ImageView) relativeLayout.findViewWithTag("first");


Drawable多个子类,例如:位图(BitmapDrawable)、图形(ShapeDrawable)、图层(LayerDrawable)等。


meta-data的使用 在于activity同节点的里面添加
<meta-data android:name="myconfig" android:value="config123" />
ApplicationInfo ai = getPackageManager().getApplicationInfo(this.getPackageName(),PackageManager.GET_META_DATA|PackageManager.GET_ACTIVITIES);
Bundle bundle = ai.metaData;
如果在activity节点里要获取到activity信息
PackageInfo ai = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA|PackageManager.GET_ACTIVITIES);
Bundle bundle = ai.activities[0].metaData;


listview中的按钮会有优先权,造成Item不可点击,可把按钮的focusable,focusableInTouchMode,clickable设置为false,条目就可触发。


SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
sqb.setTables(RSS_TABLE);//设置查询的表
sqb.appendWhere(RSS_ID + "=" + uri.getPathSegments().get(1));
Cursor c = sqb.query(rssDb, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);


ActivityXXX.this.setTitle(title);
TextView的属性:android:autoLink="web"


${filecomment}
${package_declaration}
/**
* @author xxxx
* @version 创建时间:${date} ${time}
* 类说明
*/
${typecomment}
${type_declaration}


params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| //让窗口失去焦点和不相应触摸
params.format=PixelFormat.TRANSLUCENT ;//让窗口透明


apk中内嵌资源或二进制文件时一般使用下面的两种方法:
方法一
res/raw目录下存放,比如cwj.dat一个二进制文件,我们可以读取可以直接
InputStream is=context.getResources().openRawResource(R.raw.cwj);
方法二
工程根目录下的assets文件夹中存放,比如assets/cwj.dat 这样我们使用下面的代码
AssetManager am = context.getAssets();
InputStream is = am.open(cwj.dat);


viewStub的默认属性是invisible,不是gone,通过设置他为visible或者调用他的inflate方法,都可以实现加载这个view,他继承自view,可以在运行时加载,此外他还不同于view设置invisible,view设置为invisible后,该view会被inflate,会占据一定的空间,但是viewStub不会。
private void initialize(Context context) {
mContext = context;
setVisibility(GONE);
setWillNotDraw(true);
}


一个handler实例只能接收它自己发来的消息,但是多个handler共享一个messageQueue


Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
animation.setFillAfter(true);//动画停留在结束的状态

缩放图片:

new ImageGetter()
{

@Override
public Drawable getDrawable(String source)
{
Drawable drawable = getResources().getDrawable(
getResourceId(source));

if (source.equals("image3"))
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() / 2,
drawable.getIntrinsicHeight() / 2);
else
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight() );
return drawable;

}
}, null);

//设置样式,调用style.xml

setTheme(R.style.FullScreenDialog);
super.onCreate(savedInstanceState);


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics