处于不同栈Activity之间的启动与数据传递

本文介绍了Android中Activity的四种启动模式(standard、singleTop、singleTask、singleInstance),并详细探讨了不同启动模式下如何在Activity间进行数据传递,包括使用onActivityResult及onNewIntent方法的具体场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法传递。但是栈与栈之间传递数据不安全,不建议使用,应该减少这种操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值