本文讲述两点
一、Activity
二、Intent
Activity
在Android中,Activity提供了与用户交互的可视化界面。
在一个Android应用中可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity被压入下面成为非活动Activity,等待是否可能被恢复为活动状态,4个重要状态如下.
Activity生命周期的回调方法
如何设置Activity
(1)创建Activity,一般继承android.app的Activity类,也可以继承它的之类,如下,创建一个名称为"MyActivity"的Activity
import android.app.Activity;
public class MyActivity extends Activity{
}
(2)重写回调方法,并且在该方法调用setContentView()方法显示界面,在(1)中创建的Activity中,重写onCreate()方法,并设置显示的页面为activity_my.xml
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_me);
}
(3)配置Activity
一个Activity对应一个< activity></ activity>
配置方法是在AndroidManifest.xml 的< application></ application>标记中添加< activity></ activity>标记实现,< activity>标记格式如下.
<activity
android:name="实现类名"
android:lable="说明性文字"
android:theme="要应用的主题"
>
</activity>
配置信息如下
<activity android:name=".MyActivity" android:label="详细"></activity>
(4)启动Activity
在一个Android中,当有多个Activity时,需要应用startActivity()方法启动需要的Activity,该方法没有返回值,只有一个intent的入口参数,Intent是Android应用各组件之间的通信方式,指定要被启动的Activity
public void startActivity(Intent intent)
如要启动类名称为"MyActivity"的Activity
Intent intent = new Intent(MainActivity.this,MyActivity.class);
startActivity(intent);
(5)关闭Activity
可以使用Activity类提供的finish()方法,该方法较简单,例如,在单机按钮时关闭Activity,可以使用如下的代码
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
finish();
}
});
多个Activity的使用
当在一个Activity启动另一个Activity时,经常需要传递一些数据。这时就可以通过Intent来实现,因为Intent通常被称为两个Activity之间的信使。在Android中可以将要保存的数据放在Bundle对象中,然后通过Intent提供的putExtras()方法将要携带的数据保存在Intent中
说明:Bundle是一个key-value组合,用于保存要携带的数据包,数据类型可以是基本的类型或对应数组,也可以是对象,如果是对象或对象数组时,必须实现Serializable或者Parcelable接口.
以下按上面所述的Activity知识模拟一个简单登陆界面
MainActivity
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//为按钮添加单击监听事件.
String username = ((EditText) findViewById(R.id.edit1)).getText().toString();
String phonenum = ((EditText) findViewById(R.id.edit2)).getText().toString();
if (!username.equals("")&&!phonenum.equals("")){
//将输入的信息保存到Bundle中,通过Intent传递到另一个Activity中显示出来
Intent intent = new Intent(MainActivity.this, AddressActivity.class);
Bundle bundle = new Bundle();
bundle.putCharSequence("username",username);
bundle.putCharSequence("phonenum",phonenum);
intent.putExtras(bundle); //将bundle对象添加到Intent对象中
startActivity(intent); //启动Activity
}else{
Toast.makeText(MainActivity.this,"请把信息填完整!",Toast.LENGTH_SHORT).show();
}
}
});
}
}
activity_main.xml
使用相对布局
<EditText
android:id="@+id/edit1"
android:text="姓名"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edit2"
android:text="电话"
android:layout_below="@id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn"
android:onClick="Test"
android:layout_below="@id/edit2"
android:layout_alignRight="@id/edit2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陆"/>
AddressActivity(自己创建的一个Activity名为AddressActivity)
public class AddressActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_address);
Intent intent = getIntent(); //获取Intent对象
Bundle bundle = intent.getExtras(); //获取传递的Bundle对象.
TextView username = (TextView) findViewById(R.id.username); //获取username的TextView对象
username.setText(bundle.getString("username")); //获取输入的姓名并显示到username
TextView phonenum = (TextView) findViewById(R.id.phonenum);
phonenum.setText(bundle.getString("phonenum"));
}
}
activity_address.xml
使用相对布局
<TextView
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/phonenum"
android:layout_below="@id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
运行效果如图:
调用另一个Activity并返回结果
有时需要在一个Activity中调用另一个Activity,当调用结束后,自动返回第一个Activity
此功能可以通过Intent和Bundle来实现,与在两个Activity之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。调用startActivityForResult()方法启动Activity后,关闭新启动的Activity,将选择结果返回原Activity中。
public void startActivityForResult(Intent intent,int requestCode)
Intent
Intent中文意思是"意图"。它是Android程序中传输数据的核心对象,在Android官方文档中,对Intent的定义是执行某操作的一个抽象描述。它可以开启新的Activity,也可以发送广播消息,或者开启Service服务。
3种基本应用:
- 开启Activity
通过将一个Intent对象传递给startActivity()方法,可以启动一个新的Activity,并且可以携带一些必要的数据。另外,可以将Intent对象传递给startActivityForResult()方法中,这样,在获取返回结果时,可以在调用它的Activity的onActivityResult()方法中接收返回结果。 - 开启Service
通过将一个Intent对象传递给startActivity()方法,启动一个Service来完成一次操作(如下载文件) - 传递Broadcase(广播)
显示创建Intent
如上述所讲就是现实创建的Intent
Intent intent = new Intent(Context packageContext,Class<?>cls)
startActivity(intent);
//intent 对象名称,packageContext用于指定启动Activity上下文对象,可以使用Activity名.this(如MainActivity.this)指定
//cls:用于指定启动Activity所在的类,使用Activity名.class形式
隐式创建Intent
指在创建Intent对象时不指定具体的接收者,而是定义要执行的Action、Category和Data,然后让Android系统根据相应匹配机制找到要启动的Activity。
如在自己的应用程序中展示一个网页,调用系统浏览器打开.
Intent intent = new Intent(Intent.ACION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(intent);
Intent过滤器
使用Intent启动Activity时,并没有在Intent中指明Activity所在的类。因此,Android系统根据相应匹配机制找到要启动的Activity,这种机制就是由Intent过滤器实现。
说明:Intent过滤器是一种根据Intent中的Action、Data和Category属性对适合接收该Intent的组件进行匹配筛选。
在AndroidManifest.xml文件的各个声明标记中,使用< Intent-fest>标记声明该组件所支持的动作、数据和种类等信息。
< action>标签用于指定组件所能相应的动作,以字符串形式表现.
< data>标记用于向Action提供要操作的数据。
< category>标记用于指定以何种方式去执行Intent请求的动作。
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
模拟图片放大查看:源码后续将上传至github
以上仅为个人学习笔记,如有知识性错误,请批评指正.