Activity反馈传递参数setResult千能方法

本文介绍了在Android开发中,当ActivityA需要接收多个ActivityB的参数时,如何通过startActivityForResult()传递Class<?>类型数据。同时讨论了在ActivityA设置为singleTask模式时,导致ActivityB无法正常接收结果的问题,并引用了相关文章解释原因及提供解决方案,建议将目标Activity设置为singleTop。

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


    有时候会遇到一个很重要的ActivityA类,很多其他的ActivityB都需要向其传递参数时使用startActivityForResult()来获取结果,但是如果此ActivityB类有很多,那么ActivityA必须能够记住传进来的时候的Activity.class这个东西,不然,你无法知道Intent指向谁。

    需求说明了一下,下面介绍怎么实现。我只大概看了一下Android源码没有发现有记录传进来Activity信息的类,索性按照自己的思路来做吧,挺简单的。首先做一个实验,看是否能够传递Class<?>这个类,结果证明Class<?> cls = (Class<?>) intent.getSerializableExtra("CLS");可以传递。接下来,把这些东西移到一个继承Activity的子类BaseActivity,然后工程中所有的activity类都继承此BaseActivity。

下面是几个关键类的代码:

public class TestActivity extends BaseActivity {
	private static final String TAG = TestActivity.class.getSimpleName();
	private Context mContext = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		mContext = this;
		
		Intent intent1 = getIntent();
		String text = intent1.getStringExtra("TEST");
		Class<?> cls = getResultClass();
		Log.d(TAG, "2.收到参数:" + text + " #" + cls);
		
		if (cls != null) {
	            Intent intent = new Intent(mContext, cls);
	            Bundle bundle = new Bundle();  
                    bundle.putString("test", "test content");
intent.putExtras(bundle); setResult(Activity.RESULT_OK, intent); finish(); Log.d(TAG, "3.回传参数");}}}


public class MainActivity extends BaseActivity {

	private static final String TAG = MainActivity.class.getSimpleName();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Intent intent = new Intent(getApplicationContext(), TestActivity.class);
		Bundle bundle = new Bundle();
		bundle.putString("TEST", "TEST CONTENT");
		intent.putExtras(bundle);
		startActivityForResult(intent, 1, MainActivity.class);
		Log.d(TAG, "1.从MainActivity开始传递参数");
		
	}

	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		String result = data.getStringExtra("test");
		Log.d(TAG, result + " 收到了。符合预期结果");
        }
   }


public class BaseActivity extends Activity {

	protected Class<?> mStartClass = null;
	
	protected static final String EXTRA_CLS = "CLS";
	
	/**
	 * 这里仅仅是使得发送者也使用此CLS协议参数
	 * @param intent
	 * @param requestCode
	 * @param cls
	 */
	public void startActivityForResult(Intent intent, int requestCode, Class<?> cls) {
		// TODO Auto-generated method stub
		Bundle bundle = intent.getExtras();
		if (bundle == null) {
			bundle = new Bundle();
		}
		bundle.putSerializable(EXTRA_CLS, (Serializable)cls);
		intent.putExtras(bundle);
		super.startActivityForResult(intent, requestCode);
	}
	
	@Override
	public Intent getIntent() {
		// TODO Auto-generated method stub
		Intent intent = super.getIntent();
		mStartClass = (Class<?>) intent.getSerializableExtra(EXTRA_CLS);
		Log.d("TAG", "mStartClass:" + mStartClass);
		return intent;
	}
	
	/**
	 * 有可能为null
	 * @return
	 */
	protected Class<?> getResultClass() {
		return mStartClass;
	}
	
}

执行结果如下:

1.从MainActivity开始传递参数
mStartClass:class com.example.MainActivity
2.收到参数:TEST CONTENT #class com.example.MainActivity
3.回传参数
test content 收到了。符合预期结果


为什么标题说是千能方法呢?呵,因为我不敢打包票说这个方法是万能的。。。


================================ 补充 ============================================

当我在menifest中设置ActivityA为singleTask的时候发现在此类中设置setResult()后,ActivityB无法收到结果,并且ActivityB在执行startActivityForResult()后的执行顺序是onPause()->onActivityResult()->onResume()->onPause()->onCreate()这个顺序,这个顺序号奇怪哦,这么奇怪的问题肯定会有人遇到过,而且ActivityA设置setResult()后,ActivityB也无法收到此传递信息。搜了一下,貌似道理是如这篇文章所说的 http://www.cnblogs.com/lilihuang/archive/2011/08/23/2150409.html

现把此文转载至此:

singleTask, startActivityForResult不能共存的问题

原因未知,设置了目标BActivity为singleTask后,在AActivity中调用BActivity,例如

Intent intent = new Intent(this, BActivity.class);

startActivityForResult(intent, 1);

结果先会调用到  AActivity中的onActivityResult,而在BActivity设置setResult(Activity.RESULT_OL)后,AActivity的onActivityResult不会接受到通知。

解决方案:设置BActivity为singleTop. 

Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect. For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值