Android:两个独立的应用程序集成



我有一个现有的应用程序。现在我想添加一些额外的功能。这些额外的功能需要一些库。如果我在应用程序中使用库,应用程序的大小会增加。因此,我想在一个单独的应用程序中实现这一额外功能,然后将新应用程序集成到我现有的应用程序(如果我对现有应用程序有一些更新,那么我必须下载整个应用程序,这是我不想要的)。我不希望两者都在一个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);

这两者中的任何一个都将在堆栈中只保留每个意图中的一个,而不是每个意图的倍数。

此外,如果您想重新启动当前意图,请参阅重新启动当前目的

希望这能有所帮助。

最新更新