Activity
Activity
,直译过来就是“活动”。安卓设想移动应用由于常常涉及到应用程序间的交互,所以不应该以一个APP
为原子单位,而是以Activity
为单位,这样会更加高效、便捷,使得不同APP
间的交互可以通过调用其Activity
,而不是通过启动一个APP
。通常,在安卓应用中,一个屏幕(界面)既为一个Activity
,如启动广告界面、程序主界面等等,其中,那个主要的Activity
(main Activity
)是APP
启动后第一个运行的Activity
。
文章目录
1. Activity简介
所有的Activity
都需要在mainfest
配置文件中注册:在<application>
标签下用<activity>
标签进行声明,并且必须要有需要指出android:name
属性,既Activity
名称。(注意:若Activity
所在包与<mainfest>
标签中属性package一致时,则名称为.<Activity名称>
;若为子包中,则需加上子包名)
举例:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
2. Activity的四种状态
- 运行状态:可随意交互状态
- 暂停状态:可见,但无法交互,一般在
APP
弹出对话框时既是暂停状态。 - 停止状态:
APP
停止运行时 - 销毁状态:强行停止
APP
3. Activity的生命周期
图片来源:https://www.jianshu.com/p/b5a72a741025
4. 创建Activity
- 创建自定义
Activity
类,继承自android.app.Activity
- 重写
Oncreate
方法 - 设置要显示的视图:
setContentView(<布局文件,如R.layout.activity_main>)
- 在
mainfests
文件夹中的安卓全局配置文件中注册Activity
5. 启动和关闭Activity
主Activity需要配置,在APP
启动时将自动启动。
- 配置主Activity(唯一)
启动:在AndroidMainfest.xml
中配置
在相应<Activity>
标签下加入以下几行代码:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<action>
:Activity响应什么动作
<category>
:响应类型
intent
:用以显示(我要启动xxx Activity)或隐式(我要启动能发邮件的Activity)的启动Activity
-
手动启动Activity
基本代码如下:
//1. 创建Intent对象 Intent intent = new Intent(<ThisActivity>.this, <NextActivity>.class); //2. 启动Activity startActivity(intent);
-
手动关闭Activity
finish();
-
刷新Activity
onCreate(null)
6. Activity间的数据交换
依托于Intent
使用Bundle
进行数据交互
Bundle
类似于map
,key-value
形式保存。
存放数据:<Bundle>.putXXX()
,XXX包括Byte
,Char
,CharSequence
…
提取数据:<Bundle>.getXXX()
存放数据基本步骤:
-
创建
Intent
-
创建
Bundle
-
存放数据
-
将
Bundle
放到Intent
中举例:
//将输入的信息保存到Bundle中,通过Intent传递到另一个Activity当中并显示出来 Intent intent = new Intent(MainActivity.this, AddressActivity.class); //创建并实例化一个Bundle对象 Bundle bundle = new Bundle(); bundle.putCharSequence("name", name);//保存姓名 intent.putExtras(bundle);//将Bundle对象添加到Intent对象中 startActivity(intent);//启动Activity
提取数据基本步骤:
-
获取
Intent
-
获取
Bundle
-
提取数据
举例:
Intent intent = getIntent();// 获取Intent对象 Bundle bundle = intent.getExtras();// 获取传递的Bundle信息 String name = bundle.getString("name");// 提取数据
7. 启动一个Activity,获取数据后返回
-
启动Activity时使用
startActivityForResult(<Intent>,<int requestCode,请求码,作为标识>)
-
重写
onActivityResult
方法,该方法既获取数据后的回调方法。 -
在另一个Activity中:
- 存放数据到
Bundle
中:直接getIntent()
获取Intent
,而不是新创建一个Intent
- 使用
setResult(<int 结果码>, <Intent>)
- 结束当前
Activity
- 存放数据到
举例:
第一个Activity:用以启动第二个Activity,并处理返回结果。
package com.mingrisoft;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button= (Button) findViewById(R.id.btn);//获取选择头像按钮
button.setOnClickListener(new View.OnClickListener() { //为按钮创建单机事件
@Override
public void onClick(View v) {
//创建Intent对象
Intent intent=new Intent(MainActivity.this,HeadActivity.class);
startActivityForResult(intent, 0x11);//启动intent对应的Activity
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0x11 && resultCode==0x11){ //判断是否为待处理的结果
Bundle bundle=data.getExtras(); //获取传递的数据包
int imageId=bundle.getInt("imageId"); //获取选择的头像ID
ImageView iv=(ImageView)findViewById(R.id.imageView); //获取布局文件中添加的ImageView组件
iv.setImageResource(imageId); //显示选择的头像
}
}
}
第二个Activity:用以存放数据,并回调。
package com.mingrisoft;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class HeadActivity extends Activity {
public int[] imageId = new int[]{R.drawable.touxiang1, R.drawable.touxiang2,
R.drawable.touxiang3, R.drawable.touxiang4, R.drawable.touxiang5
}; // 定义并初始化保存头像id的数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_head);
GridView gridview = (GridView) findViewById(R.id.gridView); // 获取GridView组件
BaseAdapter adapter=new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageview; //声明ImageView的对象
if(convertView==null){
imageview=new ImageView(HeadActivity.this); //实例化ImageView的对象
/*************设置图像的宽度和高度******************/
imageview.setAdjustViewBounds(true);
imageview.setMaxWidth(158);
imageview.setMaxHeight(150);
/**************************************************/
imageview.setPadding(5, 5, 5, 5); //设置ImageView的内边距
}else{
imageview=(ImageView)convertView;
}
imageview.setImageResource(imageId[position]); //为ImageView设置要显示的图片
return imageview; //返回ImageView
}
/*
* 功能:获得当前选项的ID
*/
@Override
public long getItemId(int position) {
return position;
}
/*
* 功能:获得当前选项
*/
@Override
public Object getItem(int position) {
return position;
}
/*
* 获得数量
*/
@Override
public int getCount() {
return imageId.length;
}
};
gridview.setAdapter(adapter); // 将适配器与GridView关联
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = getIntent(); //获取Intent对象
Bundle bundle = new Bundle(); //实例化要传递的数据包
bundle.putInt("imageId", imageId[position]);// 显示选中的图片
intent.putExtras(bundle); //将数据包保存到intent中
setResult(0x11, intent); //设置返回的结果码,并返回调用该Activity的Activity
finish(); //关闭当前Activity
}
});
}
}