一、Activity基本概念
Activity 主要用于和用户进行交互。
所有的Activity都需要在Androidmanifest.xml文件中注册才能生效。通过activity标签对活动进行注册
Androidmanifest.xml文件内容:
<activity android:name=".MainActivity">
<!-- android:name 用来指定具体注册的是哪个活动
.MainActivity 是隐藏包名的缩写
-->
<!--
intent-filter 这样配置表示这个活动是**主活动**
-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
二、Activity的启动方式
显示Intent启动和隐式Intent启动
Intent:是Android程序中各个组件之间交互的一种方式;通过它可以实现各组件之间的数据传递,还可以指明当前组件想要执行的动作。
Intent(Context packageContext, Class<?> cls);
第一个参数,要求提供一个启动活动的上下文;
第二个参数,指定想要启动的目标活动
startActivity(),是专门用于启动活动的方法,它接收一个intent参数。
将构建好的Intent传人startActivity()方法就可以启动目标活动了。
1、显示启动
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
/*
显式Intent 启动目标活动
表示在MainActivity这个活动中去启动SecodeActivity这个活动
*/
Intent mIntent = new Intent(MainActivity.this,SecodeActivity.class);
startActivity(mIntent);
}
});
扩展小知识
Activity继承于Context。this:表示当前对象。哪个类调用就是指向该对象。
类名.this(MainActivity.this):表示这个类对象(MainActivity对象)。当在内部类的方法中需要引用外部类时,就要用到这种写法;如果在内部类中直接使用this,则表示内部类本身。
MainActivity是一个外部类,View.OnClickListener是一个内部类,在内部类中使用外部类方法需要使用外部类名.this引用外部类的实例。
类名.class:返回的是这个类的Class对象
获取Class对象的方式通常有三种:
1、通过类名.class获取 ;
2、通过已经实例化的对象获取,getClass()方法获取;
3、通过Class.forName(“类的全名称”)获取,这种方法比较少见。
2、隐式启动
此方式并不明确的指出我们想要启动的活动,而是通过指定action和category等信息,交由系统分析这个Intent,从中选出最合适的活动去启动。
由于这种方式是交由系统来决定的,所以只要在系统中匹配到就可以启动该活动,故此方式可以启动第三方应用,也可以启动系统内置应用。
当系统匹配到多个应用时,会弹出选择提示框,用于用户选择启动哪个应用。
在Androidmanifest.xml文件中,通过activity标签下配置intent-filter标签的内容,就可以指定当前活动的action和category。
<activity android:name=".SecodeActivity">
<intent-filter>
<action android:name="com.sky.activitytest.SECODE_ACTIVITY_ACTION"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="com.sky.activitytest.SECODE_ACTIVITY_CATRGORY"></category>
</intent-filter>
</activity>
/*
这里定义了可以响应SecodeActivity的action(com.sky.activitytest.SECODE_ACTIVITY_ACTION)和category(com.sky.activitytest.SECODE_ACTIVITY_CATRGORY)配置信息。
*/
/*
只有当Intent中指定的action和category同时能够匹配Androidmanifest.xml中的action和category,这个活动才能响应。
android.intent.category.DEFAULT是一只默认的category,在调用startActivity()方法时会自动将这个category添加到Intent中。
*/
**每个Intent只能指定一个action,可以指定多个category**
// 隐式Intent 启动活动
Intent mIntent = new Intent("com.sky.activitytest.SECODE_ACTIVITY_ACTION");
mIntent.addCategory("com.sky.activitytest.SECODE_ACTIVITY_CATRGORY");
startActivity(mIntent);
三、activity之间传递数据 – Intent
http://blog.youkuaiyun.com/good__man/article/details/63812419
此链接有详细说明 《关于Activity之间传递数据的6种方式》
1、使用Inten的putExtra传递
2、使用Activity销毁时传递数据
3、使用SharedPreferences传递数据
4、使用静态变量传递数据
5、使用序列化对象Seriazable
1、向下一个活动传递数据:
使用intent.putExtra()方法来传递数据;该方法有两个接收参数:
第一个参数是键,用于启动的活动从这个键中取得值;
第二个参数是传递的数据。
intent传递的数据除了可以是整型、布尔型、字符串;还可以是bundle、自定义的对象(该对象需要通过serializable或者parcelable方式进行序列化)。
firstActivity代码片段:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);
// 从firstActivity将数据(1111111)传递给SecodeActivity
mIntent.putExtra("data", "1111111");
startActivity(mIntent);
}
});
SecodeActivity代码片段:
Intent intent = getIntent();
// getData 就是从firstActivity传来的数据(1111111)
String getData = intent.getStringExtra("data");
除了getStringExtra,还可以使用getIntExtra()、getBooleanExtra()、getSerializableExtra()、getBundleExtra()、getSharedPreferences()来获取数据;这主要是看从firstActivity中传递什么类型的数据来选择的。
2、返回数据给上一个活动:
要想实现这样的效果,需要在firstActivity中使用startActivityForResult()方法来启动SecodeActivity,而不再通过startActivity()方法。
startActivityForResult()方法有两个参数;
第一个参数是Intent,
第二个参数是请求码,用于在回调中判断数据的来源。
在SecodeActivity中返回时,先构建intent,用于传递数据,然后调用setResult()方法,最后调用finish()去销毁当前活动SecodeActivity。
setResult()方法有两个参数;
第一个参数一般只使用RESULT_OK或者RESULT_CANCELED,用于向上一个活动返回处理的结果;
第二个参数是Intent。
SecodeActivity在销毁后,才会回调上一个活动(firstActivity)的onActivityResult()方法。所以在onActivityResult()方法里面接收处理数据即可。
onActivityResult()方法有三个参数;
第一个参数是我们启动活动时出入的请求码,
第二个参数是返回数据时传入的处理结果,
第三个参数是返回的数据。
firstActivity代码片段:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// 传递数据,并接收上一个活动返回的数据
Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);
mIntent.putExtra("data", "This data is from firstActivity");
startActivityForResult(mIntent,1);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// case 1 -> 这里的1就是startActivityForResult(mIntent,1)里面的1。
case 1:
if (resultCode == RESULT_OK) {
// getData 就是从SecodeActivity传回给firstActivity的数据。
// 即getData的内容为:This data is from SecodeActivity
String getData = data.getStringExtra("data");
}
break;
}
}
SecodeActivity代码片段:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secode_layout);
Intent intent = getIntent();
// getData 就是从firstActivity获取到的数据。
// 即getData的内容为:This data is from firstActivity
String getData = intent.getStringExtra("data");
}
// 当按返回键时,让SecodeActivity销毁。只有当SecodeActivity销毁才会回调firstActivity中的onActivityResult()方法
@Override
public void onBackPressed() {
Intent intent = new Intent();
// 将要返回给firstActivity的数据
intent.putExtra("data","This data is from SecodeActivity");
setResult(RESULT_OK, intent);
finish();
}
finish()和System.exit(0)
finish():仅仅把当前Activity退出了,但是并没有释放资源。
System.exit(0):是退出整个应用程序的,是针对整个Application的。将整个进程直接kill,活动所占的资源会被释放。等同于使用android.os.Process.killProcess(android.os.Process.myPid());