【问题标题】:Send result back to parent activity wihout finishing child activity在不完成子活动的情况下将结果发送回父活动
【发布时间】:2012-04-30 10:20:11
【问题描述】:

我正在开发两个应用程序。第一个有一个按钮,当按下它时会启动一个带有一些数据的隐式意图。 Intent 由注册在其他应用的主要活动上的inten-filter 捕获。

我需要的是子活动立即将一些数据发送回父(在后台)而不完成,并且必须留在前台。

我试图通过startActtivityForResult()OnActivityResult() 的方式来实现这一点,但没有成功。事实上,这种方法只有在子活动完成时才有效。

我正在寻找其他解决方案,例如服务...但我是新手,至少需要找到正确的路径。

提前致谢。

我给你一些进一步的细节:

第一个活动(父)启动以下意图:

Intent intent = new Intent();           
intent.setAction("xx.xx.xxxxx");
intent.putExtra("Data1", data1);
intent.putExtra("Data2", data2);
...             
startActivityForResult(intent,MANAGE_CODE);

OnActivityResult() 方法是

public void onActivityResult(int requestCode, int resultCode, Intent data)
{                
    switch (requestCode) {
    case MANAGE_CODE:
        switch (resultCode) {
        case 0: 
                ...
                break;
        }
    break;
    }
}

子活动执行此操作:

    Intent caller = getIntent();
    if ( caller.getAction().equals("xx.xx.xxxxx") ) {
              Intent intent = new Intent();
      intent.putExtra("data", "12345");
      // Set result 
          getParent().setResult(0, intent);
}

我省略了实现细节...如果我不关闭子活动(例如使用 finish() 方法),我看不到 setResult() 调用有效

【问题讨论】:

  • “父”应用将如何响应?它在后台,可能会被您无法控制的平台杀死。无论如何它会如何收到结果?请解释您要达到的目标。我怀疑你可能需要重新考虑你的方法,或者正如你所说的,作为服务。
  • 也许在两个活动之间使用 ResultReceiver
  • 亲爱的西蒙,你可能是对的。我不能这样做,因为父活动没有运行。可能需要另一种方法。 Waqas,我会调查 ResultReceiver。谢谢。

标签: android android-intent android-service android-activity


【解决方案1】:

运行一个服务并让它广播一个带有您需要的附加内容的意图,然后在父级的 BroadcastReceiver onReceive 中检索它们。

例子:

public class serviceD extends Service{
    private Intent intent_broadcast;
static final String BROADCAST_ACTION = "com.example.ServicesAndBroadcastIntent";

    public void onCreate(){
        super.OnCreate();
        intent_broadcast = new Intent(BROADCAST_ACTION);
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        intent_broadcast.putExtra("EXTRA_MSG","data");
        sendBroadcast(intent_broadcast);
        stopSelf();
        return startId;
    }
}

【讨论】:

  • 这听起来很有趣。以下工作流程是否正确? 1)APP A(有一个BC Receiver)的Activity发起一个intent; 2)意图被APP B的一个进入前台的活动捕获。 APP A 进入后台。 3) APP B 启动一个服务,该服务仅用于广播带有一些数据的意图。 4) APP A(在后台)检索广播消息并更新其状态,并在 APP B 仍在前台时执行此操作。能用吗?
  • @Abde 听起来不错。试试看。只要应用 A 为相同的操作注册了广播接收器,就应该没有问题。
  • 我刚刚在官方 android 文档中读到,如果一个进程有一个正在执行其 onReceive 方法的广播接收器,则该进程被视为“前台”。另一种可能是实现一个IPC,将两个应用绑定到同一个服务,但这需要我仔细研究。但是我会尝试,我会告诉你。谢谢。
【解决方案2】:

据我了解,您希望在更改子活动时将更改反映在父活动中。因为该任务亲和力可能会帮助您 检查以下链接:查找任务关联

1) http://developer.android.com/guide/components/tasks-and-back-stack.html 2)http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

【讨论】:

    【解决方案3】:

    请参考以下代码并进行比较...

    int SECOND_ACTIVITY = 2;

    一项活动

    Intent intent = new Intent();
    
    intent.setClassName(A.this , B.class);
    
    intent.setClassName(A.this , B.class);
    
    
    intent.setClassName(A.this, B.class);
    
    startActivityForResult(intent, SECOND_ACTIVITY);
    ...
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, intent);
    Bundle extraBundle;
    if(requestCode == SECOND_ACTIVITY){
    
    Log.d("SECOND_ACTIVITY_LOG","THIS CLOSE !!");
    
    if(resultCode == RESULT_OK){
    extraBundle = intent.getExtras();
    String str = extraBundle.getString("key1");
    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
        }
      }
     }
    
    }
    
    
    
    B activity
    
    
    intent = new Intent();
    intent.putExtras(extraBundle);
    this.setResult(RESULT_OK, intent);//if return RESULT_OK , then A can receive.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多