目录
2.2活动
活动是一种包含用户界面的组件,主要用于与用户交互。
必须在AndroidManifest.xml中注册。
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />:标识该活动为主活动。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
所有的活动必须继承Activity或者其子类。
onCreate():活动创建时必须执行的方法。
setContentView():给当前活动引入布局。
2.2.1手动创建活动
app/src/main/java/com.example.activitytest中新建Activity,名字为 Empty Activity
(Generate Layout File表示自创建一个布局文件;Launcher Activity将该活动设置为当前项目主活动,Compatibility为项目启动向下兼容模式)
2.2.3创建和加载布局
android讲究逻辑与视图分离,最好每个活动对应一个布局文件,布局用来显示界面内容
app/src/main/res中创建Directory,名为layout;layout中创建Layout resource file,根元素选择LinearLayout
(XML中:引用一个id,使用@id/id_name;定义一个id,使用@+id/id_name)
项目中所有的资源都会在R文件中生成一个相应资源的id
在AndroidManifest中注册
所有活动都要在在AndroidManifest中注册才能生效。
活动的注册要放在<application>标签内
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>//声明为主活动
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
没有主活动的项目可以安装,但无法打开。一般作为第三方服务供其他应用在内部调用。
2.2.4在活动中使用toast
用作显示提示信息
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);//获取在布局文件中定义的元素,返回View对象
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();//(Contest,“文本内容”,显示时长)
finish();
}
});
}
findViewById():获取在布局文件中定义的元素。返回View对象,一般需要向下转型。
makeText(Context,"message",显示时长):
Context:Toast要求的上下文,Activity本身也是Context对象。
message:提示的信息。
显示时长:Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
2.2.5在活动中使用Menu
res下新建Directory,名为menu。menu下新建Menu resource file,名为main。
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item//创建菜单项
android:id="@+id/add_item"//唯一标识符
android:title="Add"/>//菜单项名称
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
活动中:
public boolean onCreateOptionsMenu(Menu menu) {//创建菜单
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {//菜单响应事件
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
getMenuInflater():返回当前Activity下的MenuInflater对象。
inflate(R.menu.main,Menu):创建菜单,第一个参数:指定用哪一个资源来创建菜单;第二个参数:指定创建的菜单项添加到哪一个Menu对象中。
getItemId():返回点击的菜单项的ID。
return true:显示菜单。
2.2.6销毁活动
finish()
2.3使用Intent
Intent:用于Android程序中各个组件之间的交互。一般可以用于启动活动,启动服务,发送广播等
2.3.1显示Intent
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
Intent(Context packageContext,Class<?>cls)//(启动活动的上下文,想要启动的目标活动)
2.3.2隐式Intent
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
public void onClick(View v){
Intent intent = new Intent(“com.example.activitytest.ACTION_START”);
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
每个intent只能指定一个action,但是可以有多个category
只有<action>和<category>中的内容同时匹配Intent指定的内容,该活动才能相应这个Intent。
2.3.3更多的隐式intent用法
打开网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
Intent.ACTION_VIEW:常用的内置常量,对于要跳转的内容进行最合适的处理。
Uri.parse(String):将String解析为Uri对象;
setData(Uri):设置Intent处理的数据,自动清除Intent里原来的数据。
同时在<intent-filter>中配置<data>标签,用于精确指定当前活动能相应什么类型数据
<data>标签可配置一下内容:
android:scheme;//用于指定数据协议部分,如http。
android:host;//用于指定数据的主机名部分,如www.baidu.com
android:port;//用于指定数据方端口部分,一般紧随在主机名之后
android:path;//用于指定主机名和端口之后的部分,如一段网址中跟在域名后面的部分
android:mimeType;//用于指定可以处理的数据类型,允许使用统配符的方式进行指定
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" />
</intent-filter>
除了http协议外,还有geo表示地理位置和tel表示拨打电话
intent.setData(Uri.parse("tel:10086"));
2.2.4向下一个活动传递数据
String data = "Hello the second";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);//(key,data)
startActivity(intent);
Intent intent = getIntent();//捕获启动SecondActivity的Intent
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
2.3.5返回数据给上一个活动
public void onClick(View view){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
break;
default:
}
}
startActivityForResult(Intent,RequestCode):子活动销毁时能够返回一个结果给父活动。Intent,父活动;RequestCode:大于0时,子活动销毁时会返回给onActivityResult()。
onActivityResult(int requestCode, int resultCode, Intent data):得到子活动返回的数据。requestCode,启动时传入的请求码;resultCode,子活动传输的处理结果;Intent,带有数据的Intent;
子活动
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
setResult(RESULT_OK,intent):向父活动返回数据,第一个参数RESULT_OK/RESULT_CANCELED;第二个参数,带有数据的Intent。
2.4活动的生命周期
2.4.1返回栈
Android使用任务(Task)管理活动,一个任务就是一组存放在栈里活动集合(返回栈Back Stack)。
2.4.2活动状态
1.运行状态:活动处于返回栈栈顶
2.暂停状态:活动不处于返回栈栈顶,但仍然可见
3.停止状态:活动不处于返回栈栈顶,并且不可见
4.销毁状态:活动从返回栈中移除
2.4.3活动的生存期
onCreate():活动第一次被创建时使用,完成初始化操作。
onStart():活动由不可见变为可见时使用。
onResume():活动准备好与用户交互时使用,此时活动位于返回栈栈顶,处于运行状态。
onPause():在系统准备去启动或恢复另一个活动的时候调用。执行速度一定要快。
onStop():活动完全不可见时使用。与onPause()的区别:如果是对话框式活动,onPause()会执行。
onDestroy():活动被销毁之前调用。
onRestart():活动在停止状态变为运行状态之前调用。
完整生存期:onCreate()--onDestroy()
可见生存期:onStart()--onStop(),活动对用户可见。
前台生存期:onResume()--onPause(),活动可以和用户交互。
2.4.5保存临时数据
onSaveInstanceState(Bundle):在活动被回收前调用,Bundle有一系列保存数据的方法。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just type";
outState.putString("data_key",tempData);//(键,值)
}
public static final String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate");
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG,tempData);
}
}
2.5活动的启动方式
AndroidManifest.xml中改变活动属性:<activity android:launchMode="">
standard:系统不在乎该活动返回栈中是否存在,每次启动时创建新的实例。
singleTop:启动活动时,如果该活动在返回栈栈顶,则直接使用。
singleTask:每次启动活动时,检查返回栈中是否存在该活动的实例,如果存在,则直接使用,并且该活动之上的所有实例均出栈。
singleIestance:启动一个新的返回栈管理该活动,便于共享活动。