我有一个活动B,它是从一个活动A生成的。在活动B中,我有一个按钮,它将把我发送到活动C.在活动C里面,我将运行一个服务,我希望在该服务内回到活动B。
因此它将是A-> B-> C->服务 - > B
那个B活动就像是apk转移的聊天/历史,现在我还没有使用数据库(以后我会更改代码,我现在不能)。
将在活动B中显示的数据来自该服务(我将发送apk文件),并且在发送文件之后我想要向活动B检索我发送的应用程序的名称,以便我可以在聊天/历史记录中显示。
如果在服务中我创建了一个将运行活动B的新意图,它将始终再次启动活动B,而不是"保持"已存在的旧信息。
你们怎么认为我应该这样做?
我知道有一个标志会调用已经在堆栈中的活动B(当发生这种情况时,它会转到onResume()方法(对吗?)),但是还有其他选择吗?
这样做的最佳方式是什么?
谢谢你们!对不起,如果它太混乱了。
答案 0 :(得分:2)
要保留ActivityB,请在清单中放置以下内容:
<activity android:name="ActivityB"
android:launchMode="singleTask" />
这会保持活动。 onCreate
只会被调用一次。所有进一步的请求都应在onNewIntent()
处理。
来自LocalActivityManager.java startActivity
doc:
如果当前活动使用非多重启动模式(例如
singleTop
),或者Intent有FLAG_ACTIVITY_SINGLE_TOP
标志 设置,然后当前活动将继续运行及其 名为Activity.onNewIntent()
的方法。
答案 1 :(得分:1)
从FirstActivity使用startActivityForResult()方法调用SecondActivity
例如:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在SecondActivity中设置要返回FirstActivity的数据。如果您不想退回,请不要设置任何内容。
例如:在secondActivity中,如果要发回数据:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
如果您不想返回数据:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
现在,在您的FirstActivity类中,编写onActivityResult()方法的以下代码。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//onActivityResult
答案 2 :(得分:1)
使用
启动活动C.Intent nextIntent = new Intent(this, ActivityC.class);
startActivityForResult(nextIntent, requestCode);
在服务上,您可以使用结果代码完成活动,以确定它是成功还是失败。 在活动B中,通过onActivityResult接收结果。如果成功请从数据库中提取数据(使用singleton Datahelper类来设置/获取数据,因为您现在没有实现数据库。使用非常容易集成和处理的Realm)。
我想这会解决你的问题。