2015-08-24 58 views
1

这不是一个重复的问题。我只发现this问题相关,但它没有任何工作解决方案。startActivityForResult()不适用于外部活动

我有什么

我有两个应用程序都是由我创造,应用程序A和B.应用我的要求是从应用程序打开一个应用B上的一个按钮的点击。现在,应用程序B将执行一些处理并向App A返回一个小的状态。这应该是可能的不是吗?

我做了什么

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE); 
getActivity().startActivityForResult(intent, 6699); 

这将打开应用B完美。现在在应用B中,

Intent returnIntent = new Intent(); 
returnIntent.putExtra("STATUS", statusCode); 
setResult(RESULT_OK, returnIntent); 
finish(); 

而这是我在活动上的onActivityResult()方法。尽管我从片段开始了活动。

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     Log.d(TAG, "ON ACTIVITY RESULT"); 

     if (requestCode == 6699) { 

      if (resultCode == RESULT_OK) { 

       Log.d(TAG, "RESULT OK"); 

      } 
      if (resultCode == RESULT_CANCELED) { 

       Log.d(TAG, "RESULT NOT OK"); 

      } 
     } 
    } 

问题

onActivityResult()当我开始应用B与RESULT_CANCELLED.活动这怎么可能被刚刚叫什么名字?是因为它的一项新任务吗?

但是当我在应用程序B上调用finish(),它关闭并将我带回应用程序A,但是这次不会调用onActivityResult()?我该如何解决这个问题?

这是一个非常基本的要求,应该有一个解决方案。

+2

从[文档](http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29):“如果您正在启动的活动使用singleTask启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果“ –

+0

在其清单中没有针对应用B中的活动提及的launchMode。那么什么是错的? –

回答

1

你真的应该添加一个自定义的意图过滤器来实现这一点。这将允许您指导您希望应用程序B执行的任务流程,与您如何使用应用程序B分开。请参阅Android docs Intent Filter了解如何执行此操作。基本上,你为它们做广告进入清单的应用程序B,这样的事情:

<activity android:name="ShareActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEND"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <data android:mimeType="text/plain"/> 
    </intent-filter> 
</activity> 

应用程序A会使用这样的:

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); 
sendIntent.setType("text/plain"); 

// Verify that the intent will resolve to an activity 
if (sendIntent.resolveActivity(getPackageManager()) != null) { 
    startActivity(sendIntent); 
} 

这些课程的需要为您定制的应用程序。

+0

谢谢。你能提供一个关于如何完成的例子吗?我已经发布了我在问题中所做的一切。 –

+0

我应该使用startActivity()而不是startActivityForResult()吗? –

+0

是的,startActivityForResults是获取信息的正确方法。 – PearsonArtPhoto

1

我终于解决了这个问题。

如果你正在开展活动使用singleTask启动模式,它 不会在你的任务运行,因此你会立即收到 取消结果

这就是文档说什么。现在的想法是,如果被叫活动在新任务上启动,结果将立即取消。在我的情况下,我从一个不同的应用程序开始一个活动,总是从一项新任务开始,不管任何launchModetaskAffinity或标志。

每当我做这样的事情,

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE); 
getActivity().startActivityForResult(intent, 6699); 

这个标志Intent.FLAG_ACTIVITY_NEW_TASK是默认自动添加。因此,我们需要开始使用活动前清除所有标志,

intent.setFlags(0); 

调用startActivity()之前使用它。解决方案同时很简单和棘手。