这篇文章会涉及到以下几个内容 一 Activity的生命周期 一 Activity的生命周期
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话 言归正传,Activity的基本生命周期如下代码 所示:
Java 代码
protected protected protected protected protected public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); } 你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断 这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。 详细介绍一下这几个方法中系统在做什么以及我们应该做什么: onCreate: 在这里创建界面 ,做一些数据 的初始化工作 onStart: 到这一步变成用户可见不可交互 的 onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个 onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一 onstop: 变得不可见 ,被下一个activity覆盖了 onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方 二 让Activity变成一个窗口:Activity属性设定
android:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Translucent" 就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable 上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。
Java代码
public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890);}
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState != null){ long id = savedInstanceState.getLong("id");}
四 调用与被调用:我们的通信使者Intent 要说Intent了,Intent就是这个这个意图 ,应用程序间Intent进行交流,打个电话啦,来个
Java代码
Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); startActivity(intent); 扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计 地确实很好啊。 那Intent通过什么来告诉系统需要谁来接受他呢?
Java代码
Intent intent = new Intent(this, MyActivity.class);intent.getExtras().putString("id", "1");tartActivity(intent);
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
<intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:value="android.intent.action.EDIT" /> <action android:value="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /></intent-filter> 这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗? action其实就是一个意图的字符串名称。 不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。 想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如: |