引用官方的说法: 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上
要创建Activity 必须继承自Activity或者Activity的子类。在Activity的各个生命阶段实现对应的方法;
其中重要的两个方法: onCreate() ,系统在创建Activity时调用此方法;在此方法实现视图绑定;一些 控件的初始化 onPuase(); 用户离开当前Activity调用的第一个方法 , 创建完成后必须在Manifest文件中 声明此Activity 系统才会知道有这个Activity
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
如果有需要也可以为此Activity添加IntentFilter(IntentFilter稍后我会再做总结),以供外部程序来启动,一般同一应用中不会用到隐式启动。
<activity android:name=".AActivity">
<intent-filter>
<action android:name="com.skymxc.action.x1" />
<action android:name="com.skymxc.action.x2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.skymxc.catagory.c1" />
<category android:name="com.skymxc.catagory.c2" />
<data android:scheme="http" />
</intent-filter>
</activity>
最简单的Activity 只绑定了一个视图
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
可以通过一个intent 来启动 一个Activity ,关于intent稍后会做总结
在明确的指导要启动的Activity的时候可以显示使用intent来启动
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
如果需要传递数据,可以在intent中放入数据
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("origin", "哈哈");
startActivity(intent);
获取数据
Intent intent = getIntent();//获取启动此activity的intent
String origin = intent.getStringExtra("origin");
在不明确要启动的Activity的时候 可以在intent中添加关于启动目标的描述和类型,系统会过滤所有的Activity的intentFilter来匹配 ;一般 在同一个应用中不必使用隐式Intent;
例如 我在为A Activity添加这样的IntentFilter:
<activity android:name=".AActivity">
<intent-filter>
<action android:name="com.skymxc.action.x1" />
<action android:name="com.skymxc.action.x2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.skymxc.catagory.c1" />
<category android:name="com.skymxc.catagory.c2" />
<data android:scheme="http" />
</intent-filter>
</activity>
要启动上面的Activity可以这样写
Intent in = new Intent();
////要执行的动作的描述 所有的action中 有一个匹配行
in.setAction("com.skymxc.action.x2");
//附加信息的描述 这里的描述只要在intentFilter中声明了就能匹配上,
// 如果有一项未声明则匹配不上,如果intentFilter中没有可以不添加,会使用默认的category
in.addCategory("com.skymxc.catagory.c2");
//对数据进行描述 C中定义了协议为 file
in.setDataAndType(Uri.parse("http://"),"audio/13");
if (in.resolveActivity(getPackageManager())!=null){
//启动
startActivity(in);
}else{
Toast.makeText(this,"系统中不存在可以执行此操作的程序",Toast.LENGTH_SHORT).show();
}
如果启动一个Activit只为获得某个结果 可以 使用 startActivityForResult() 来启动一个Activity ,在获得结果后会回调 方法:onActivityResult();
去图库获取图片 第二个参数是请求码 在onActivityResult()中区分结果
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//为了结果去启动一个Activity
startActivityForResult(intent1,50);
onActivityResult()中获取到取得的图片
/**
*
* @param requestCode 启动时的 requestCode
* @param resultCode 跳转的activity给的
* @param data 跳转的activity给的 返回的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode== 50 && resultCode ==RESULT_OK && data != null){
Uri uri = data.getData(); //返回是标识符指定图片所在的位置的统一资源标识符
img.setImageURI(uri); //设置给 ImageView
}
}
当用户 离开Activity去往另一个Activity时;Activity会被压入返回栈,如果内存不够就会被销毁 ,当Activity被销毁后其中的数据当然就没了,如果需要保留这些数据可调用 方法 onSaveInstanceState()方法
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
//存入数据
outState.putBoolean("checked",true);
}
当此Activity被创建时 就能取出数据了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState!=null){
boolean checked = savedInstanceState.getBoolean("checked");
}
setContentView(R.layout.activity_main);
}
看一张图描述了整个Activity由生到死的一套回调方法
先说一下上图的方法:
关于这里提到的intent ,intentFilter 我会在之后总结。