Activity的启动模式有四种:
1、standard
最普通,Activity最常见并且默认的启动模式,可以实现不停地向任务栈中叠加新的Activity实例。
2、singleTop
如果该Activity(singleTop)已经存在于Task栈中,并且置于栈顶,那么再次启动该Activity时,将不再实例化Activity,而是直接持有该Activity的引用。
如果该Activity不在栈顶,则new一个新的Activity置于栈顶。
3、singleTask
如果当前Task栈中已经存在某个以singleTask启动好的Activity,那么当该Activity再次被启动,则直接将该Activity置入当前Task栈顶,并移除该Activity之上的所有Activity。
4、singleInstance
该Activity独占一个Task Stack,在该Activity中启动另外一个Activity并不会在当前栈中创建实例或引用。如果重复开启该Activity (singleInstance),会检查当前BackStack中有没有该Activity的实例,如果有,则将该Activity所在TaskStack压入BackStack栈顶。
当进行两个Activity之间启动,传输数据,数据回传的操作时候。一般用到onActivityResult方法(当两个Activity在用一个TaskStack任务栈中)
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 MainActivity extends AppCompatActivity {
Button button;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button_main);
textView = (TextView) findViewById(R.id.textview);
ActivityUtils.getInstance().stacks.add(this);
final String weather_info = "这是main传输的数据";
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("CONTENT", weather_info);
intent.putExtra("BUNDLE_WEATHER_INFO", bundle);
// startActivity(intent);
startActivityForResult(intent, 100);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){
switch (requestCode){
case 100:
Bundle bundle = data.getBundleExtra("BUNDLE_MSG");
String msg = bundle.getString("MSG");
textView.setText(msg);
break;
}
}
}
}
LoginActivity中写了退出键的操作方法,利用建立一个Stack的方式。将每个Activity添加到Stack中,在遍历finish掉。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Stack;
public class LoginActivity extends AppCompatActivity {
TextView textView;
Button button;
Button button_2;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ActivityUtils.getInstance().stacks.add(this);
textView = (TextView) findViewById(R.id.tvshow);
button = (Button)findViewById(R.id.button);
button_2 = (Button) findViewById( R.id.button2);
//回传数据
button_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("MSG", "这是回传的数据");
intent.putExtra("BUNDLE_MSG", bundle);
setResult(RESULT_OK, intent);
LoginActivity.this.finish();
}
});
//设置button退出程序键的 监听事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Stack<Activity> activities = ActivityUtils.getInstance().stacks;
// for (Activity activity: activities){
// if (activity instanceof MainActivity || activity instanceof LoginActivity){
//
// activity.finish();
// }
// }
for (int i = activities.size() - 1; i >= 0; i--){
Activity activity = activities.get(i);
if (activity instanceof MainActivity || activity instanceof LoginActivity){
activity.finish();
activities.remove(i);
}
}
}
});
//接受数据
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("BUNDLE_WEATHER_INFO");
String msg = bundle.getString("CONTENT");
textView.setText(msg);
}
}
当两个Activity不在同一个TaskStack任务栈中,假设A_Activity和B_Activity,B_Activity的启动模式为singleInstance.当不同任务栈中的Activity进行startActivityForResult方法调用,则会直接按照RESULT_CANCELED处理,不会等待开启的Activity完成之后才回调。
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import com.example.androidtest07.R;
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
}
public void onClick(View view){
Intent intent = new Intent(this, BActivity.class);
// startActivity(intent);
startActivityForResult(intent, 100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(AActivity.this, "---" + requestCode + "---" + resultCode, Toast.LENGTH_LONG).show();
Toast.makeText(AActivity.this, "---" + data, Toast.LENGTH_LONG).show();
}
}
当在A_Activity中启动B_Activity时候,A_Activity会立刻调用onActivityResult方法,不等B_Activity给A_Activity回执。(B_Activity的启动模式为sengleInstance)
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.androidtest07.R;
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}
}
不同栈之间传递数据不能用onActivityResult方法传递,用onNewIntent方法传递。但是栈与栈之间传递数据不安全,不建议使用,应该减少这种操作。