一、前提
Activity是开发中必有也是最重要的一部分
二、目标
1、AndroidMainifest中一些属性
2、Activity的生命周期
3、Activity的跳转以及数据传递
4、四种启动模式
三、内容
1、AndroidMainifest中一些属性
以下属性都可以添加到activity中
android:label="text" <!--设置标题-->
android:theme="@style/Theme.AppCompat.NoActionBar" 没有标题
android:screenOrientation="portrait" 竖屏显示 ;landscape 横屏显示
android:launchMode="" 启动模式
<intent-filter></intent-filter>默认的启动Activity
2、Activity的生命周期
期间会经历的阶段有
onCreate():创建一个Activity
onStart():将onStart()分派给所有片段。确保所有创建的加载器都是现在开始。
onResume():将onResume()分派到片段。注意,为了更好的互操作,对于较旧版本的平台,此时调用附属于活动的片段是,而不是恢复。这意味着在某些情况下,仍然可以保存以前的状态,这是不允许的
onPause():就是暂停,将onPause()分派给片段。
onStop():停止
onRestart():重启
onDestory():毁坏
当我们运行一个Activity时会先启动onCreate(),onStart(),onResume(),退出后会启动onPause(),onStop(),onDestory()
3、Activity的跳转以及数据传递
首先在activity_main文件中添加一个按钮
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sunny.activity.MainActivity">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="text"/>
</RelativeLayout>
在MainActivity中添加
package com.example.sunny.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1= (Button) findViewById(R.id.btn1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AActivity.class);
startActivity(intent);
}
});
}
}
其实点击事件中的代码就是跳转事件
另外再创建两个java文件,相互跳转使用,我创建了一个AActivity.java和BActivity.java,再第一个布局文件中添加一个按钮,再第二个布局文件中添加一个按钮一个文本框
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sunny.activity.AActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.sunny.activity.BActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#000000"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
(1)显式跳转
在AActivity.java中添加
package com.example.sunny.activity;
import android.content.ComponentName;
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.Toast;
public class AActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
button= (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式跳转1
Intent intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
}
//显式跳转2
Intent intent=new Intent();
intent.setClass(AActivity.this,BActivity.class);
startActivity(intent);
//显式跳转3
Intent intent=new Intent();
intent.setClassName(AActivity.this,"com.example.sunny.activity.BActivity");
startActivity(intent);
//显式跳转4
Intent intent=new Intent();
intent.setComponent(new ComponentName(AActivity.this,"com.example.sunny.activity.BActivity"));
startActivity(intent);
显式跳转有四种表达方式,最常用的是第一种,第三种和第四种中的其中一个参数是你的文件所在的包名
这样你点击按钮后便会跳转到B文件
(2)隐式跳转
//隐式跳转
Intent intent=new Intent();
intent.setAction("com.test.BActivity");
startActivity(intent);
注意在使用隐式跳转时要在AndroidMainifest中的B活动下添加,其中的action android:name=""中可以随便写,category中的意思是不要将其视作开机时的首要文件
<activity android:name=".BActivity" android:label="B">
<intent-filter>
<action android:name="com.test.BActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
(3)数据传递
将自己所用的数据传至下一个活动,代码如下
Intent intent=new Intent(AActivity.this,BActivity.class);
Bundle bundle=new Bundle();
bundle.putString("name","mengqi");
bundle.putInt("int",90);
intent.putExtras(bundle);
startActivity(intent);
因为我们要通过putExtras()方法进行传值,摁住Ctrl键点击putExtras()后进入其方法内可以看到,它其实就是new Bundle(),通过bundle的方法进行传值,所有可以之间创建一个Bundle,Bundle表示从字符串值到各种可打包类型的映射,传入数据后再传给intent。
在BActivity.java中添加,表示接收数据
package com.example.sunny.activity;
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.TextView;
public class BActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
textView= (TextView) findViewById(R.id.tv1);
button= (Button) findViewById(R.id.button);
final Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");
int number=bundle.getInt("int");
textView.setText(name+","+number);
}
}
效果图在最后
(4)启动Activity,结束后返回结果
意思就是当b活动接收到信息后返回给A活动一个信息,只需将startActivity(intent)变为下一行的代码即可,因为在app开发中,不可能只有一个活动会传回消息,添加一个请求码就可以知道是哪一个发出的请求
startActivityForResult(intent,0);//请求码,根据请求码可以判断是哪一步跳转过去的
在BActivity.java中添加一个点击事件,表示将信息传回
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
Bundle bundle1=new Bundle();
bundle.putString("title","i am back");
intent.putExtras(bundle);
setResult(Activity.RESULT_OK, intent);//判断是否成功
finish();
}
});
最后在AActivity中添加,表示自己接受回调的信息,意思是将传入的结果分派到正确的片段。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(AActivity.this, data.getExtras().getString("title"), Toast.LENGTH_SHORT).show();
}
4、启动模式
Activity是由任务栈管理的,没启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity
Activity的android:launchMode属性
standard:标准模式,默认,每启动一个Activity,都会创建一个新的实例
singleTop:Task栈顶复用模式(先进后出,后进先出),当要启动的Activity已经位于栈顶时,不会创建新的实例,会复用栈顶的Activity,并且其onNewIntent()方法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例
singleTask:Task栈内复用模式,在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用其onnewIntent()方法,并且该Activity上面的Activity会被清除,如果栈中没有,则创建新的实例
singleInstance:全局单例模式,全局复用,不管那个Task栈,只要存在目标Activity,就复用。每个Activity占有一个新的Task栈,使用较少
四、总结
Activity很重要内容也较多,当然还会继续补充