- 浏览: 673433 次
文章分类
最新评论
-
ymm8505:
不错…… 学习了
final -
zht19880706:
楼主,没看懂在 android 代码怎么设置
Android Audio延迟(latency) -
zjc198805:
用popwindow呈现的时候,好像不能会弹,不知道怎么回事, ...
android pinch:双指缩放图片和单指拖拽
我的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);
相关推荐
android 我的笔记 源码android 我的笔记 源码
android studio实现笔记本
使用sqllite作为本地数据的android笔记本app。代码不多,可以快速理解。
一些散乱的Android笔记
Android学习笔记 > 十年生死两茫茫,不思量,自难忘,华年短暂,陈辞岁月悠悠伤, > 满腔热血已芜荒,展未来,后生强,战战兢兢,如履薄冰心彷徨, > 青丝化雪、鬓角成霜,已是英雄迟暮,人生怎慷慨激昂? 目录 ...
Android学习笔记 Android学习笔记 Android学习笔记
由real6410公司提供的android开发笔记 针对real6410开发板,可迅速提高android开发 技能
第一行代码 android学习笔记 修改完整版
入门必须要看的android笔记,由浅入深,activitiey,intent。。。。
Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
Android开发教程笔记完全版 谢谢大家
Android开发笔记全集
Android学习笔记
Android基础笔记 Android基础笔记 Android基础笔记 Android基础笔记
Android代码笔记齐全 入门教程
Android驱动开发笔记
android笔记初学者必看 包含代码和知识要点 为求职做好充分准备
Android学习笔记-常用的一些源码,防止忘记了,也是android面试中常见的问题
Android开发笔记(中文) 希望对你学习Android有所帮助