运行环境:Android Studio 1.5
模拟器:Genymotion
Activity基础
概念
Activity就是一个可视化的用户界面,负责创建一个屏幕窗口,防止UI组件,供用户交互。
用法
- 1.创建你的Activity类
- 2.在AndroidManifest.xml中注册
- 3.设置布局文件
AndroidManifest.xml
- 应用程序的清单文件
- xml是一种标记语言
Activity启动方法
显式启动
class跳转
- 新建一个类继承Activity
- protected
- onCreate
- SetContentView
- 按钮监听
- Button btnStart;
- btnStart=(Button) findViewById(R.id.btn_start_second)
- btnFinish.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){//关闭自己}}; )
- 第一种方法
- Intent intent = new Intent();
- intent.setClass(MyActivity.this, SecondActivity.class);
- startActivity(intent);
包名类名跳转
- Intent intent1 = new Intent();
- intent.setClassName(MyActivity.this, "com.lkj.lesson.activitylesson1.SecondActivity");
- startActivity(intent1);
第三种方法
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName(MyActivity.this, SecondActivity.class);
- intent.setComponent(componentName);
- startActivity(intent);
隐式跳转
隐式启动第一种写法
- Intent intent = new Intent(“abcd.SecondActivity”);//构造intent时传入action name
- startActivity(intent);
隐式启动第二种写法
- Intent intent = new Intent();//构造intent完成后设置action name
- intent.setAction(“abcd.SecondActivity”);
- startActivity(intent);
注意
- 如果自己定义的某个Activity要通过隐式启动,在AndroidManifest.xml的category标签必须加上android.intent.category.DEFAULT,否则不起作用
注意事项
- category标签必须设置成DEFAULT
Action
- 代表系统中已经定义的一系列常用的动作,可以启动你想要的动作
- 属性的值是一个字符串
- 通过setAction()方法或在清单文件AndroidManifese.xml中设置
- 当有多个Action匹配隐式启动条件时,将会弹出选择框
Category
- 指定当前Action被执行的环境
- 通过addCategory()方法或在清单文件AndroidManifest.xml中设置
- 常用值
- android.intent.category.LAUNCHER设置该组件为在当前应用程序启动器,通常为入口ACTION_MAIN配合使用
- android.intent.category.DEFAULT是安卓系统中木人的执行方式,按照普通Activity的执行方式执行。
Activity生命周期
详看博客:两分钟彻底让你明白Android Activity生命周期(图文)!知识库博客园 http://kb.cnblogs.com/page/70125/
Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:
view plaincopy to clipboardprint?
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
举个例子,修改ActivityDemo.java(我这里重新写了以上的七种方法,主要用Log打印),代码如下:
package com.tutor.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class ActivityDemo extends Activity {
private static final String TAG = "ActivityDemo";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e(TAG, "start onCreate~~~");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart~~~");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume~~~");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop~~~");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy~~~");
}
}
- 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
- 2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
- 3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
- 4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
- 5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
- 6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
- 7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
Activity启动模式
- 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;
四种启动模式
standard
singleTop
singleTask
singleInstance
Android入门:Activity四种启动模式 - meizixiong - 博客园
http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html
getTaskId()可以获取当前的taskid。
Intent几种常见的flags:
1.FLAG_ACTIVITY_NEW_TASK:APPa调用APPb会新建一个task
2.FLAG_ACTIVITY_CLEAR_TOP:启动task中已经有了的activity的话会直接跳到那个activity,并删除上面的activity。
3.FLAG_ACTIVITY_REORDER_TO_FRONT启动task中已经有了的activity的话会把他直接调到task最顶上,也不会删除任何activity.
4.FLAG_ACTIVITY_SINGLE_TOP:目前发现与Activity启动模式中的singleTop效果相同.
Activity数据传递
在第一个activity里设置intent.putExtra(“var”,”String_content”)
在第二个activity里调用getIntent().getStringExtra(“var”)
通过Intent传递基本数据类型
通过Bundle传递基本数据类型
复杂类型的数据传递Serializable
复杂类型的数据传递Parceable
activity数据回传
startActivityForResult(intent);
onActivityResult(requestCode, resultCode, data)
setResult(RESULT_OK, intent)
启动系统的Activity
需要申请权限
打开系统的拨号界面
intent.setAction(Intent.ACTION_CALL);
打开系统发送短信界面
Uri smsToUri = Uri.parse(“smsto:”+”10086”)
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(smsToUri);
intent.putExtra(“smsbody”)
打开系统相机界面
intent.setAction(Intent.ACTION_***_CAMERA);
Activity启动过程中的intentFilter
Data匹配的四条规则:
1. 如果data的URI和datatype为空,则 filter 的URI和type也必须为空,才能匹配成功
2. 如果data的URI不为空,但是datatype为空,则 filter 必须定义URI并匹配成功,且type为空,才能匹配成功
3. 如果data的URI为空,但是datatype不为空,则 filter 必须URI为空,定义type并匹配成功,才能匹配成功
4. 如果data的URI和data都不为空,则 filter 的URI和type都必须定义并匹配成功,才能匹配成功。对于URI部分,有一个特殊处理,就是即使filter没有定义URI,content和file两种URI也作为既存的URI存在。