1、Activity的生命周期

  • onCreate:创建时调用
  • onStart:在屏幕上可见,但是还没有获得焦点
  • onResume:可见并且获得焦点
  • onPause:可见,但是失去焦点
  • onStop:不可见
  • onDestroy:销毁时调用
  • 手机内存不足时,会杀死之前启动的进程,按照LRU算法(最近最少使用)锁定杀死谁

2、Activity的启动模式,每个应用会有一个Activity任务栈,存放已启动的Activity

Activity的启动模式,修改任务栈的排列情况

  • Activity task stack:任务栈
    • 连续的内存空间
    • 后进先出

* singleTop 单一顶部模式
1、如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。
2、应用场景:浏览器的书签
* singeTask 单一任务栈,在当前任务栈里面只能有一个实例存在
1、当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在
2、应用场景:浏览器的activity
3、如果一个activity的创建需要占用大量的系统资源(cpu,内存)一般配置这个activity为singletask的启动模式。webkit内核 c代码

* singleInstance启动模式非常特殊, activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在
1、如果你要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
2、应用场景: 电话拨打界面

  • 横竖屏切换,默认情况下 ,横竖屏切换, 销毁当前的activity,重新创建一个新的activity
    • 用以下代码让横竖屏切换时不重建Activity,让系统的环境 不再去敏感横竖屏的切换(在清单文件中activity配置)。

android:configChanges="orientation|screenSize|keyboardHidden"

    • 用以下代码写死屏幕方向(在清单文件中activity配置)

android:screenOrientation="portrait"

3、Activity摧毁时返回数据

1. 开启activity并且获取返回值

startActivityForResult(intent, 0);
2. 在新开启的界面里面实现设置数据的逻辑

Intent data = new Intent();
data.putExtra("phone", phone);
//设置一个结果数据,数据会返回给调用者
setResult(0, data);
finish();//关闭掉当前的activity,才会返回数据

3. 在开启者activity里面实现方法

//通过data获取返回的数据
onActivityResult(int requestCode, int resultCode, Intent data) {
//只有通过startActivityForResult启动的Activity销毁时返回intent对象,才会回调此方法
}
4. 通过判断请求码和结果码确定返回值的作用

通过请求码判断来自哪个Activity,通过结果码判断什么数据

package com.ecollab.transmitdata2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { public static final int Contact = 10;
public static final int Sms = 20;
public static final int Handler_exception = 30;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View v){
Intent intent = new Intent(this, ContactActivity.class);
//启动一个Activity去获取数据
startActivityForResult(intent, Contact);
} public void click2(View v){
Intent intent = new Intent(this, SmsActivity.class);
//启动一个Activity去获取数据
startActivityForResult(intent, Sms);
} public void click3(View v){
Intent intent = new Intent(this,HandleExceptionAcivity.class);
//启动一个Activity去获取数据
startActivityForResult(intent, Handler_exception);
} //只有通过startActivityForResult启动的Activity销毁时返回intent对象,才会回调此方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); //通过请求码判断来自哪个Activity,通过结果码判断什么数据
if(requestCode == Contact)
{
String name = data.getStringExtra("name");
EditText et = (EditText) findViewById(R.id.et);
et.setText(name);
}
else if(requestCode == Sms)
{
String sms = data.getStringExtra("sms");
EditText et = (EditText) findViewById(R.id.et_sms);
et.setText(sms);
}
//通过请求码判断来自哪个Activity
else if(requestCode == Handler_exception)
{
//再通过结果码判断数据data是什么类型
if(resultCode == 100)
{
String name = data.getStringExtra("name");
EditText et = (EditText) findViewById(R.id.et);
et.setText(name);
}
else if(resultCode == 200)
{
String sms = data.getStringExtra("sms");
EditText et = (EditText) findViewById(R.id.et_sms);
et.setText(sms);
}
}
}
}
package com.ecollab.transmitdata2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class ContactActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact);
final String[] names = new String[]{
"张三",
"李斯",
"王五"
};
//显示联系人列表
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.itemlist, R.id.tv, names));
lv.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent data = new Intent();
data.putExtra("name", names[position]);
setResult(0, data); finish();
}
});
}
}
package com.ecollab.transmitdata2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class SmsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); final String[] names = new String[]{
"我在开会",
"我在开车",
"我在外地出差",
"我在吃饭"
}; ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.itemlist, R.id.tv, names)); lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) { Intent data = new Intent();
data.putExtra("sms", names[position]);
setResult(0, data);
finish();
}
});
}
}
package com.ecollab.transmitdata2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView; public class HandleExceptionAcivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_handlexception); final TextView tv_name = (TextView) findViewById(R.id.tv_name);
final TextView tv_content = (TextView) findViewById(R.id.tv_content); tv_name.setOnClickListener(new OnClickListener() { public void onClick(View v) {
Intent data = new Intent();
data.putExtra("name", tv_name.getText());
setResult(100, data);
finish();
}
}); tv_content.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent data = new Intent();
data.putExtra("sms", tv_content.getText());
setResult(200, data);
finish();
}
});
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ecollab.transmitdata2.MainActivity"
android:orientation="vertical"
> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<EditText
android:id="@+id/et"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择联系人"
android:onClick="click"
/>
</LinearLayout> <EditText
android:id="@+id/et_sms"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="快捷回复"
android:onClick="click2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="认错"
android:onClick="click3"
/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="老婆"
/>
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="该死,又犯错啦"
/>
</LinearLayout>

android 学习随笔十五(Activity的生命周期与摧毁时返回数据 )的更多相关文章

  1. Android SDK上手指南:Activity与生命周期

    Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...

  2. Android开发艺术1之Activity的生命周期

    作为<Android开发艺术探索>这本书的第一篇博客,我就多说几句.本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程.不敢说书评,也不能说教程,只希望对有些人有帮助就好 ...

  3. Android 横屏切换竖屏Activity的生命周期(转)

    曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期.现在给大家分析一下他切换时具体的生命周期是怎么样的:  1.新建一个Activity,并把各个生命周期打印出来  2.运行Acti ...

  4. Android学习笔记(十) Activity的生命周期

    一.如何在一个应用程序中定义多个Activity -定义一个类,继承Activity -复写onCreate() setContentView(R.layout.secondLayout):设定该Ac ...

  5. android 学习随笔十八(广播与服务 )

    1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...

  6. Android(java)学习笔记170:Activity的生命周期

    1.首先来一张生命周期的总图: onCreate():创建Acitivity界面       onStart():让上面创建的界面可见              onResume():让上面创建的界面 ...

  7. Android(java)学习笔记113:Activity的生命周期

    1.首先来一张生命周期的总图: onCreate():创建Acitivity界面       onStart():让上面创建的界面可见              onResume():让上面创建的界面 ...

  8. android 学习随笔十六(广播 )

    1.广播接收者 BroadcastReceiver 接收系统发出的广播 现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了  Andro ...

  9. android 学习随笔十四(页面跳转与数据传递)

    1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...

随机推荐

  1. Selenium2学习-003-WebUI自动化实战实例-001-百度搜索

    此文主要通过百度搜索功能,进行 Selenium2 的实战实例讲解,文中所附源代码于 2015-01-16 02:01 亲测通过,敬请亲们阅览.希望能对初学 Selenium2 UI 自动化测试编程的 ...

  2. 破解win10系统密码

  3. Vue.2.0.5-Render 函数

    基础 Vue 推荐使用在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 templa ...

  4. swap文件

    # dd if=/dev/zero of=/tmp/myswap bs=1M count=4096 # mkswap /tmp/myswap # swapon /tmp/myswap # vim /e ...

  5. [Call Vibrator] How to Enable Outgoing Call Vibration without ROOT

    Call Vibrator requires the radio log of phone to detect when outgoing call is answered. But since An ...

  6. 详解 ASP.NET并行,异步,多线程

    最近在学习.net4以上版本新特性的时候,发现在异步这方面提供了很多好玩的.以下Mark 2篇好文,温故而知新! http://www.cnblogs.com/wisdomqq/archive/201 ...

  7. mysql management note

    related url : http://willvvv.iteye.com/blog/1563345 http://lxneng.iteye.com/blog/451985    这篇文章对vari ...

  8. mysql之innodb_buffer_pool

    1>.mysqld重启之后,innodb_buffer_pool几乎是空的,没有任何的缓存数据.随着sql语句的执行,table中的数据以及index 逐渐被填充到buffer pool里面,之 ...

  9. XMPP协议介绍

    一.xmpp协议工作原理 二.XMPP地址模式 三.xmpp消息格式 xmpp xml包括三个元素,message,presence,iq,也翻译做三种节. 在'jabber:client'和'jab ...

  10. notpad++安装python插件

    1.安装python并添加到环境变量 2.在notpad++ 运行工具下点击运行,输入如下命令: cmd /k python "$(FULL_CURRENT_PATH)" & ...