gz问题
??? "singleTop"
??? "singleTask"
??? "singleInstance"
??? 默认模式是“standard”。
??? 前面文章:“Android四种Activity的加载模式”已经详细描述,这里就不做描述了.
android:noHistory
??? 用于标记当用户从Activity上离开并且它在屏幕上不再可见时Activity是否从Activity stack中清除并结束(调用finish()方法)——“true”,表示它应该关闭,“false”,表示不需要。默认值是“false”。
??? “true”值意味着Activity不会留下历史痕迹。因为它不会在Activity stack的Task中保留,因此,用户不能返回它。
??? 比如启用界面的就可以借用这个。
android:taskAffinity
?? 这就是本文所描述的任务共用性。
?? Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。Task的affinity是由它的根Activity决定的。
?? affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
??? 默认情况,一个应用程序中的所有Activity都拥有相同的affinity。捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。为了明确Activity不宿主特定的Task,设定该特性为空的字符串。
??? 如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。
?
跟 Task 有关的 Intent对象中设置的Flag
FLAG_ACTIVITY_BROUGHT_TO_FRONT
??? 这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。
FLAG_ACTIVITY_CLEAR_TOP
??? 如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。
??? 例如,假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity B的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。
??? 上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为“multiple”(默认值),并且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。
??? 这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从Notification Manager处启动一个Activity。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
??? 如果设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。
??? 这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需要启动图片浏览Activity来显示。这个Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望回到查看的会话中,但不是查看图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序时都将全部清除。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
??? 如果设置,新的Activity不会在最近启动的Activity的列表中保存。
FLAG_ACTIVITY_FORWARD_RESULT
??? 如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
??? 这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
FLAG_ACTIVITY_MULTIPLE_TASK
??? 不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。
??? 由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。
??? 如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。
FLAG_ACTIVITY_NEW_TASK
??? 如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相同的次序。
??? 这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。
??? 使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。
??? 这个标志不能用于调用方对已经启动的Activity请求结果。
FLAG_ACTIVITY_NO_ANIMATION
??? 如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。
FLAG_ACTIVITY_NO_HISTORY
??? 如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。
FLAG_ACTIVITY_NO_USER_ACTION
??? 如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。
??? 典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
??? 如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。
FLAG_ACTIVITY_PREVIOUS_IS_TOP
??? If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
FLAG_ACTIVITY_REORDER_TO_FRONT
??? 如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。
??? 例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.
FLAG_ACTIVITY_SINGLE_TOP
??? 如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
?
?Activity的声明周期Task
?以2个Activity为例
第一个为A1,第二个为A2。
第一次试验,A1使用startActivity跳转到A2,A2使用返回键回到A1.A1锁频,A1解除锁频,A1退出
从A1启动:
A1:Create??? 这里是所有Activity的入口函数,第一次被创建会调用。
A1: Start?????
A1: Resume
??? Activity栈中只有:?? A1
从A1跳转到A2:跳转方式为startActivity(Intent);
A1: Pause??? 首先暂停暂停当前Activity-A1
A2:Create??? 创建A2
A2: Start
A2: Resume
A1: Stop???? 当A2创建完毕,将A1停止。但是没有调用Destroy,A1扔保留在Activity的栈中。
??? Activity栈中有:?? A1,A2
从A2按返回键,回到A1。
A2: Pause??? 首先暂停当前Activity-A2
A1: Restart? 因为A1未被销毁,所以无需重新创建,调用onCreate,直接从Restart开始。
A1: Start?????
A1: Resume
A2: Stop???? 当A1创建完毕,将A2停止。
A2: Destory当使用返回键回退时,Activity栈会将A2弹出栈,所以此时A2的onDestroy会被调用。
?? Activity栈中有:?? A1
A1界面时,长时间放置或使用锁屏键进行锁屏
??????????? A1: Pause
解除锁屏
??????????? A1: Resume
A1使用返回键退出程序
A1: Pause
A1: Stop?
A1: Destory? A1被弹出栈
??? Activity栈中有:? 空
第二次试验,A1使用startActivity+finish()跳转到A2,在A2界面使用返回键,回退到桌面。
从A1启动:
A1:Create??? 这里是所有Activity的入口函数,第一次被创建会调用。
A1: Start?????
A1: Resume
??? Activity栈中只有:?? A1
从A1跳转到A2:跳转方式为startActivity(Intent);
A1: Pause??? 首先暂停暂停当前Activity-A1
A2:Create??? 创建A2
A2: Start
A2: Resume
A1: Stop???? 当A2创建完毕,将A1停止。但是没有调用Destroy,A1扔保留在Activity的栈中。
A1: Destory?? finish会调用当前Activity的onDestroy函数,将当前Activity销毁。
??? Activity栈中有:?? A2
从A2按返回键,将会回到进入程序时的界面。因为按返回键,将当前Activity弹出,栈中空了。
A2: Pause??? 首先暂停当前Activity-A2
A2: Stop????
A2: Destory当使用返回键回退时,Activity栈会将A2弹出栈,所以此时A2的onDestroy会被调用。
?? Activity栈中有:?? 空
实例总结:
??? 1.使用startActivity跳转,在第二个页面创建完毕后系统才会调用onStop(),并不会调用onDestroy()。因为Activity并没有被弹出栈,而是不停的被压入栈。
2.使用返回键回到上一个Activity时,系统会调用当前Activity的onDestroy(),将当前activity弹出栈。
3.当调用finish方法后,系统并非马上调用当前Activity的onDestroy。而是先执行后边的代码。
finish();
Intent jumpIntent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(jumpIntent);
Intent jumpIntent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(jumpIntent);
finish();
两种代码执行效果是一样的。
4、手动调用onDestroy等操作,与系统调用不同。手动调用是无效的。也就是说,当进行跳转时,手动调用了onDestroy(),Activity仍然会在栈中,而且也仍然会执行onDestroy之后的代码。
5、Finish()与onDestroy
Finish() 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。
onDestroy() 系统销毁了这个Activity的实例在内存中占据的空间。在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间什么的都没有咯~~。当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。
http://blog.csdn.net/coding_glacier/article/details/7415016很详细
?
?android 启动第三方程序的代码(利用ComponentName)
?
在Intent中可以直接使用Intent.setClass()
也可以使用组件Component
简单的例子:
package com.ccp;???
?
import android.app.Activity;??
import android.content.ComponentName;??
import android.content.Intent;??
import android.os.Bundle;??
import android.view.View;??
import android.view.View.OnClickListener;??
import android.widget.Button;???
?
public class Test extends Activity {???
??? /** Called when the activity is first created. */??
??? @Override??
??? public void onCreate(Bundle savedInstanceState) {???
??????? super.onCreate(savedInstanceState);???
?????? setContentView(R.layout.main);???
??????? Button btn = (Button) findViewById(R.id.btn);???
??????? btn.setOnClickListener(new OnClickListener() {???
???????????????
??????????? @Override??
??????????? public void onClick(View v) {??
//组件名称,第一个参数是包名,也是主配置文件Manifest里设置好的包名??
第二个是类名,要带上包名???
??
??????????????? ComponentName com = new ComponentName("com.ccp", "com.ccp.Test1");???
??????????????? Intent? intent = new Intent();??
//设置部件???
??????????????? intent.setComponent(com);???
??????????????? Test.this.startActivity(intent);???
??????????? }???
??????? });???
??? }??
}?
android 启动第三方程序的代码
方法一:
Intent intent = new Intent();?
intent.setClassName(<package name>, <class name>);?
startActivity(intent);
?
方法二:
Intent i=new Intent;
ComponentName com= new ComponentName(<Package Name> , <Calss Name>);?
i.setComponent(com);?
startActivity(i);?
//启动媒体库
Intent i = new Intent();
ComponentName comp = new ComponentName("com.android.camera","com.android.camera.GalleryPicker");
i.setComponent(comp);
i.setAction("android.intent.action.VIEW");
startActivity(i);
?
//启动相机
Intent mIntent = new Intent();
ComponentName comp = new ComponentName("com.android.camera","com.android.camera.Camera");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);
?
//启动htmlviewer,并打开指定的一个文件 注意TXT不能是ANSI的,否则会乱码
Intent intent = new Intent();
ComponentName cn = new ComponentName("com.android.htmlviewer", "com.android.htmlviewer.HTMLViewerActivity");
intent.setComponent(cn);
Uri uri = Uri.fromFile(new File("/sdcard/demo.txt"));
intent.setDataAndType(uri, "text/plain");
startActivity(intent);
?
?
Environment 是一个提供访问环境变量的类
?
Environment 包含常量
?
MEDIA_BAD_REMOVAL
解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除
MEDIA_CHECKING
解释:返回getExternalStorageState() ,表明对象正在磁盘检查。
MEDIA_MOUNTED
解释:返回getExternalStorageState() ,表明对象是否存在并具有读/写权限
MEDIA_MOUNTED_READ_ONLY
解释:返回getExternalStorageState() ,表明对象权限为只读
MEDIA_NOFS
解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。
MEDIA_REMOVED
解释:返回getExternalStorageState() ,如果不存在 SDCard 返回
MEDIA_SHARED
解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回
MEDIA_UNMOUNTABLE
解释:返回getExternalStorageState() ,返回 SDCard 不可被安装 如果 SDCard 是存在但不可以被安装
MEDIA_UNMOUNTED
解释:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard 是存在但是没有被安装
Environment 常用方法
?
方法:getDataDirectory()
解释:返回 File ,获取 Android 数据目录。
方法:getDownloadCacheDirectory()
解释:返回 File ,获取 Android 下载/缓存内容目录。
方法:getExternalStorageDirectory()
解释:返回 File ,获取外部存储目录即 SDCard
方法:getExternalStoragePublicDirectory(String type)
解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
方法:getExternalStorageState()
解释:返回 File ,获取外部存储设备的当前状态
方法:getRootDirectory()
解释:返回 File ,获取 Android 的根目录
?
?ExpandableListView(扩展列表)的使用例子
extends<!-- android:listSelector="#00000000" 去除选中时的底色 -->
?<ExpandableListView android:layout_width="fill_parent"
??????? ????android:layout_height="wrap_content"
??????? ????android:id="@+id/expandableList"
??????? ????></ExpandableListView>
/////////////////////Actvity----------------------------
public class MainActivity extends Activity {
?private ExpandableListView listView;
?private MyAdapter adapter;
?@Override
?protected void onCreate(Bundle savedInstanceState) {
??super.onCreate(savedInstanceState);
??//隐藏标题
??requestWindowFeature(Window.FEATURE_NO_TITLE);
??setContentView(R.layout.activity_main);
??adapter = new MyAdapter(this);
??
??listView = (ExpandableListView)findViewById(R.id.expandableList);
??listView.setAdapter(adapter);
??listView.setOnChildClickListener(childClick);
??
?}
?private OnChildClickListener childClick = new OnChildClickListener() {
??
??@Override
??public boolean onChildClick(ExpandableListView parent, View v,
????int groupPosition, int childPosition, long id) {
???
???Toast.makeText(MainActivity.this, "你点击了"+adapter.getChild(groupPosition, childPosition), Toast.LENGTH_SHORT).show();
???
???return false;
??}
?};
}
?
//////////////////////自定义Adapter-------------------------
public class MyAdapter extends BaseExpandableListAdapter {
?/**
? * 设置组视图的图片
? */
?int[] logos = new int[]{R.drawable.ic_launcher,R.drawable.ic_launcher};
?/**
? * 设置组视图的显示文字
? */
?private String[] generalsTypes= new String[]{"魏","蜀"};
?/**
? * 子视图显示文字
? */
?private String[][] generals = new String[][]{
???{"A","B","C"},{"D","E","F"}?
?};
?/**
? * 子视图图片
? */
?private int[][] generallogos = new int[][]{
???{R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher},
???{R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher}
???
?};
?private List<String> list;
?private Context mContext;
?LayoutInflater inflater;
?
?public MyAdapter(Context context) {
??this.mContext = context;
?}
?
?//自定义一个获得文字信息的方法
?TextView getTextView(){
??AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
????ViewGroup.LayoutParams.FILL_PARENT,64);
??
??TextView textView = new TextView(mContext);
??textView.setLayoutParams(lp);
??textView.setGravity(Gravity.CENTER_VERTICAL);
??textView.setPadding(36, 0, 0, 0);
??textView.setTextSize(20);
??textView.setTextColor(Color.BLACK);
??return textView;
??
?}
?
?
?
?@Override
?public Object getChild(int groupPosition, int childPosition) {
??// TODO Auto-generated method stub
??return generals[groupPosition][childPosition];
?}
?@Override
?public long getChildId(int groupPosition, int childPosition) {
??// TODO Auto-generated method stub
??return childPosition;
?}
?
?//-----------------------------------------
?@Override
?public View getChildView(int groupPosition, int childPosition,
???boolean isLastChild, View convertView, ViewGroup parent) {
??
??LinearLayout ll = new LinearLayout(mContext);
??ll.setOrientation(0);
??ImageView generallogo = new ImageView(mContext);
??generallogo.setImageResource(generallogos[groupPosition][childPosition]);;
??ll.addView(generallogo);
??
??TextView textView = getTextView();
??textView.setText(getChild(groupPosition, childPosition).toString());
??
??ll.addView(textView);
??return ll;
?}
?@Override
?public View getGroupView(int groupPosition, boolean isExpanded,
???View convertView, ViewGroup parent) {
??LinearLayout ll = new LinearLayout(mContext);
??????? ll.setOrientation(0);
??????? ImageView logo = new ImageView(mContext);
??????? logo.setImageResource(logos[groupPosition]);
??????? logo.setPadding(50, 0, 0, 0);
??????? ll.addView(logo);
??????? TextView textView = getTextView();
??????? textView.setTextColor(Color.BLACK);
??????? textView.setText(getGroup(groupPosition).toString());
??????? ll.addView(textView);
??return ll;
?}
?
?//---------------------------------------------------
?@Override
?public int getChildrenCount(int groupPosition) {
??// TODO Auto-generated method stub
??return generals[groupPosition].length;
?}
?@Override
?public Object getGroup(int groupPosition) {
??// TODO Auto-generated method stub
??return generalsTypes[groupPosition];
?}
?@Override
?public int getGroupCount() {
??// TODO Auto-generated method stub
??return generalsTypes.length;
?}
?@Override
?public long getGroupId(int groupPosition) {
??// TODO Auto-generated method stub
??return groupPosition;
?}
?
?@Override
?public boolean hasStableIds() {
??// TODO Auto-generated method stub
??return true;
?}
?@Override
?public boolean isChildSelectable(int groupPosition, int childPosition) {
??// TODO Auto-generated method stub
??return true;
?}
}