我有一个现有的应用程序。现在我想添加一些额外的功能。这些额外的功能需要一些库。如果我在应用程序中使用库,应用程序的大小会增加。因此,我想在一个单独的应用程序中实现这一额外功能,然后将新应用程序集成到我现有的应用程序(如果我对现有应用程序有一些更新,那么我必须下载整个应用程序,这是我不想要的)。我不希望两者都在一个apk中。两者都应该是独立的。在第一个应用程序中,比如说A,我想在新的应用程序B中调用一个活动。我使用了intent.setComponent(),应用程序B的活动是从A中调用的,但我无法在第一个程序中从应用程序B获得结果。
应用程序A
public void onClickBtnToApplicationB(View v) {
try {
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
final ComponentName cn = new ComponentName("pakacagename","package.class");
intent.setComponent(cn);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
//handle Exception
}
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case REQUEST_CODE:
handleResult(resultCode, intent);
break;
}
}
public void handleResult(int resultCode, Intent intentResult) {
switch (resultCode) {
case RESULT_OK:
String Result = intentResult.getStringExtra("RESULT");
// I need Results from Application B here..
break;
case RESULT_CANCELED:
break;
}
}
应用程序B:在应用程序B中,类1为Result 2类启动另一个活动并获取结果。收到结果后,它们被发送回handle-result方法中的第一个应用程序。所以我需要在应用程序A的handleresearch方法中得到结果,但我并没有得到。
Intent s = new Intent(1.this,2.class);
startActivityForResult(s, REQUEST_CODE_B);
protected void onActivityResult(int requestCode, int resultCode, Intent intentResult) {
switch(requestCode){
case REQUEST_CODE_B:
handleResult(resultCode, intentResult);
}
}
public void handleResult(int resultCode, Intent intentResult) {
switch (resultCode) {
case RESULT_OK:
String scanResult = intentResult.getStringExtra("RESULT");
Intent newintent = new Intent();
newintent.putExtra("RESULT", scanResult);
setResult(Activity.RESULT_OK, newintent);
finish();
break;
case RESULT_CANCELED:
break;
}
活动A上的onActivityResult
似乎从未被调用。
我敢打赌,这与你如何称活动B有关。
而不是这样做:
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
final ComponentName cn = new ComponentName("pakacagename","package.class");
intent.setComponent(cn);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
,你真的应该这样做:
Intent intent = new Intent(ACTION_B);
startActivityForResult(intent, REQUEST_CODE);
ACTION_B是"com.mypackage.myapp.ACTION_B"
形式的常量,并且您必须在B的清单中声明如下:
<activity
android:name="com.yourpackage.b.BActivity"
>
<intent-filter>
<action android:name="com.mypackage.myapp.ACTION_B" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在2意图设计中,您必须将一些数据从当前意图传递到新意图,您可以执行以下操作:
Intent i = new Intent(yourcurrentactivity.this, yournewactivity.class);
// following line is an example of passing data to the new intent.
i.putExtra(getString(R.string.str_selecteddialog), "1");
startActivity(i);
this.finish();
在onCreate中启动的新意图中,您需要从捆绑包中检索数据:
Bundle extras = getIntent().getExtras();
if (extras != null) {
// Log.i(TAG, " 022:... we got some extras");
str_selecteddialog = getIntent().getStringExtra(getString(R.string.str_selecteddialog));
显然,您必须将这种类型的代码放入两个意图中,并反转活动名称。我也会使用try命令来捕捉任何不重视额外内容的问题。这种情况一开始就必须存在。
根据变量类型,有不同类型的put和get"Extras"。为了减少混淆,我还将使用一组变量(名称-值对,即Extras)传递给意图B,并使用另一组变量从意图B传递给意图a。
此外,您希望每次只运行一个实例,这可以通过两种方式实现。在上述每个活动的清单中,您可以指定:
android:launchMode="singleTop"
或者就在开始其他意图之前将其放在开始之前活动:
Intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
这两者中的任何一个都将在堆栈中只保留每个意图中的一个,而不是每个意图的倍数。
此外,如果您想重新启动当前意图,请参阅重新启动当前目的
希望这能有所帮助。