隐式启动Activity使用action字符串,为了降低耦合度。
尽量多的使用严格模式,把耗时操作抽出来。
activity调用onDesroyed之前,不是每次都调onSaveInstanceState()。用户点击Back按钮/A启动B时,就不调用。系统调用onSaveInstanceState(),在onStop之前/onPause的前或后。
有Id的view,onSaveInstanceState会自动保存view的状态。可以设置android:saveEnable属性。
系统为每一个app分配一个唯一的linux用户标识别id,系统使用,对app不可见。保证android系统最小权限原则。
服务可以用来后台播放音乐/执行耗时的网络操作。
内容提供者:平台性/安全。 广播接收者:在manifest中注册,也可以通过code注册。
manifest中设备特性:屏幕尺寸和密度<supports-screen>/输入配置<uses-configuration>/光传感器和照相机<uses-feature>/平台版本<uses-sdk>
Activity,当前窗口获取焦点/失去焦点调onWindowFocusChanged();
Activity,singleTop模式/启动activity时FLAG_ACTIVITY_SINGLE_TOP/重新启动时,调用onNewIntent(Intent),参数为启动Activity的Intent;getIntent()返回原始intent,setIntent()更新最新Intent。
Activity,Process Lifecycle,优先级:A foreground activity;A visible activity;A background activit;A empty process;activity的后台操作要在activity BroadcastReceiver or Servic的Context下执行。
Activity,保存持久化状态:内容提供者的数据库/preferences.
Activity,Configuration改变会使activity重新启动(onPause,onStop,onDestroy),也调用onSaveInstanceState();
如果manifest中配置了configChanges,对应activity中调用onConfigurationChanged方法,不调用onCreate了。Android 3.2(API 13),除了设置”orientation”,你还必须设置”ScreenSize”。
Configuration类:屏幕尺寸/屏幕大小/屏幕方向等。
android:exported指示该Activity/服务是否能够被其他应用程序组件调用或跟它交互。true,能够被调用或交互,false不能。false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
SimpleDateFormat –> DateFormat –> Format –> Object;
android中string.xml: %1$d,第一个整型的替代; %1$s,第一个字符串的替代; 调用String.format(mContext.getResources().getString(R.id.XXX), 23);
使用<xliff:g>标签;XML本地化数据交换格式,XML Localization Interchange File Format; <resources xmlns:xliff=”urn:oasis:names:tc:xliff:document:1.2″>
android.text.TextPaint –> android.graphics.Paint –> Object;
android.widget.PopupWindow –> Object; 显示时需要传入当前的view(某个Button/整个layout);位置可以根据WindowManager的数值计算;
AlertDialog/CharacterPickerDialog/MediaRouteChooserDialog/MediaRouteControllerDialog/Presentation –> android.app.Dialog –> Object;
View实现Drawable.Callback,KeyEvent.Callback,AccessibilityEventSource接口;Dialog实现DialogInterface,Window.Callback,KeyEvent.Callback,OnCreateContextMenuListener接口;
实现遮挡:弄个view,背景灰色,全屏显示;
点击任务速度优化:使用HierarchyView查看耗时View的生成,记Measure/Layout/Draw的时间;利用DDMS查找耗时函数;使用DDMS查看耗时操作函数;
Activity的onKeyDown()方法,acitivity的任何view都不处理时,调用该方法; View的onKeyDown()方法,按键处理,eg.Menu键/Back键/Home除外;
Intent对象实现Parcelable接口; IntentFilter对象实现Parcelable接口; ContentProvider对象实现ComponentCallbacks接口;
Intent机制,协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
Intent:Action,执行的动作;Data,执行动作要操作的数据(Uri表示);type(数据类型),显式指定Intent的数据类型(MIME);category(类别),被执行动作的附加信息;component(组件),Intent的的目标组件的类名称;
显示Intent和隐式Intent:显示意图,需要在manifest中配置名字,不需要其他信息; 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件(解耦);
例如 Intent imageIntent = new Intent(); imageIntent.setAction(Intent.ACTION_PICK); imageIntent.setType(“image/*”);//设置数据类型 startActivity(imageIntent);
<intent-filter android:priority=”integer”></intent-filter>
CATEGORY_LAUNCHER:The activity can be the initial activity of a task and is listed in the top-level application launcher.
activity的android:uiOptions属性:
activity的android:taskAffinity属性:不设置,默认一个应用程序只有一个栈,这个栈以应用包命为单位;不同应用程序可以使用同一个栈;同一个task中的优先处理;
activity的android:process属性:定义activity运行所在的进程名称。一般情况下,应用的所有组件都运行在为应用创建的默认的进程中,该默认进程的名称应用包名称一致。通过定义<application>元素的“process”属性可以为所有组件指定一个不同的默认进程。但是任意组件都可以重写默认进程,以便实现多进程操作。如果该属性指定名称以“:”开头,则一个新的专属于该应用的进程将会被创建。如果该进程名以小写字母开头,则为该activity提供权限以让其在一个全局的进程中运行。这样会允许多个应用的不同组件共用一个进程,以便节省资源
Android里,app和process和task是三个完全不同的概念;process是一个继承自Linux的概念,一般一个app会有一个uid,需要时会独立地开一个process。有些process是作为app的容器的,其它process是底层linux用到的。同时,虽然很少见,也会有多个app共享一个process或者uid。 task是一个activity的栈,其中”可能”含有来自多个App的activity,也就是来自多个process,杀task一般是关闭Task的根activity引出的子树,不一定会连带kill掉对应的process。 所以这三个东西是会混在一起的,没有windows或者其它os中那么清晰的进程边界。
API中,ActivityManager类,getRecentTasks()最近开的task,HOME键长按会看到这个;getRunningAppProcesses()运行中的作为app容器的process;getRunningServices()运行中的后台服务getRunningTasks()运行中的任务;
进程生命等级:Foreground process(服务正在交互);Visible process(服务可见);Service process(音乐播放器);Background process;Empty process(缓存);
UI线程:不能执行耗时操作;非UI线程不能UI toolkit;
让UI线程执行操作:Activity.runOnUiThread(Runnable);View.post(Runnable);View.postDelayed(Runnable,long);
线程安全方法:服务中的方法;内容提供者的方法;
处理运行时变化(键盘弹出/显示输入法):保存对象;自己程序处理变化;
onSaveInstanceState()在当前的Activity中通过新的Intent启动其它Activities之后,它将通过这个方法自动保存自身的数据;
onRetainNonConfigurationInstance()当Activity曾经通过某个网络资源得到一些图片或者视频信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。 * 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。 * 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。
onRetainNonConfigurationInstance(),音乐播放器用到,保存PreviewPlayer对象;AlbumListAdapter对象;PlaylistListAdapter对象;TrackListAdapter对象;
导致资源泄露,内存无法回收.you should never pass an object that is tied to the Activity, such as a Drawable, an Adapter, a View or any other object that’s associated with a Context.
Service启动形式:Started,不需要返回数据,执行完任务应该关闭(可以利用发送广播来返回penddingIntent数据);Bound,与服务进行交互,所有组建都Unbind后,服务停止;
Service,可以声明为私有服务,即exported属性为false;Service不创建自己的线程,也不创建单独的进程(除非特殊指定);
Service,不能执行耗时操作,否则会有ANR;stopService()/stopSelf()/ stopSelfResult(startId),不计启动次数;
Service,intentFilters属性,可以像隐式意图启动activity一样,启动服务;onBind需要返回IBinder;
Service,自己创建线程去执行任务;IntentService,内部封装了工作者线程,可有多个工作者线程并行处理任务;
Service,onStartCommand()方法必须返回一个启动值,START_NOT_STICKY(系统杀死后就不再自动启动了)/START_STICKY(系统杀死后自启动,启动Intent为空,适合音乐播放器)/START_REDELIVER_INTENT(下载);
Service,startForeground();音乐播放器,提高优先级;startService:onCreate()/onStartCommand()/onDestroy(); bindService():onCreate()/onBinder()/onUnbind()/onDestroy();
一个activity可以存在多个实例; Because the activities in the back stack are never rearranged, if your application allows users to start a particular activity from more than one activity, a new instance of that activity is created and pushed onto the stack (rather than bringing any previous instance of the activity to the top). As such, one activity in your application might be instantiated multiple times (even from different tasks).
启动Activity模式; Note: Some launch modes available for the manifest file are not available as flags for an intent and, likewise, some launch modes available as flags for an intent cannot be defined in the manifest.
launchMode为singleTop,task中已经在顶部,则onNewIntent();
launchMode为singleTask,onNewIntent(); Note: Although the activity starts in a new task, the Back button still returns the user to the previous activity.
singleTask:X->Y;之后A1->A2启动Y,则task栈为A1->A2->X->Y,即按返回键会显示出X界面;
IntentFlag:FLAG_ACTIVITY_CLEAR_TOP,destroyed the top;onNewIntent(); FLAG_ACTIVITY_CLEAR_TOP与FLAG_ACTIVITY_NEW_TASK共用,定位一个存在的activity在另一个栈;
FLAG_ACTIVITY_NEW_TASK,优先在same affinity中启动;allowTaskReparenting为true,activity实例可以在不同的task栈中移动;
清除stack:alwaysRetainTaskState/clearTaskOnLaunch/finishOnTaskLaunch。
图示ViewPaper–PagerAdapter再使用机制;ViewPager associates each page with a key Object instead of working with Views directly.