Android 与索尼xperia在onActivityResult中发布
我开始活动以获得打开GPS的结果 然后在活动结果中接收。。它在一些手机上工作正常,但索尼却不工作,我不知道为什么 我使用嵌套片段 开始活动Android 与索尼xperia在onActivityResult中发布,android,onactivityresult,Android,Onactivityresult,我开始活动以获得打开GPS的结果 然后在活动结果中接收。。它在一些手机上工作正常,但索尼却不工作,我不知道为什么 我使用嵌套片段 开始活动 Intent callGPSSettingIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startA
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(
callGPSSettingIntent, openGPSRequest);
然后在片段中接收
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == openGPSRequest) {
try {
activity.hideProgress();
} catch (Exception e) {
}
activity.replaceCurrentFragment(
FramentNavigationMapInside.getInstance(branche), true, true);
}
}
主要活动
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
在每个片段中覆盖ActivityResult
我在lenove和三星进行了测试,效果很好,但索尼xperia不起作用,只在ActivityResult上运行,在主要活动中调用解决我的问题
在片段世界中我们经常遇到的一个常见问题是:虽然我们可以直接从嵌套片段调用startActivityForResult,但似乎永远不会调用onActivityResult,这给处理嵌套片段的活动结果带来了很多麻烦
解决方案
因此,从现在起,我们将从片段中调用getActivity().startActivityForResult(…),而不仅仅是startActivityResult(…)。像这样:
// In Fragment
Intent intent = new Intent(getActivity(), SecondActivity.class);
getActivity().startActivityForResult(intent, 12345);
因此,所有接收到的结果都将在单个位置处理:片段所在活动的onActivityResult
问题是如何将活动结果发送到Fragment?
因为我们不能以正常的方式,或者至少以简单的方式,直接与所有嵌套片段通信。另一个事实是,每个片段都知道它必须处理哪个请求代码,因为它也是调用startActivityForResult的片段。因此,我们选择了“向当时处于活动状态的每个片段广播,让这些片段检查请求代码并执行它们想要的操作”的方式
说到广播,LocalBroadcastManager可以做这项工作,但机修工太老了。我选择了另一种选择,EventBus,它有很多选择。我选择的是来自广场的奥托。它在性能和健壮性方面非常出色
dependencies {
compile 'com.squareup:otto:1.3.6'
}
以Otto的方式,让我们创建一个总线事件,作为一个包含这些活动结果值的包
import android.content.Intent;
/**
* Created by nuuneoi on 3/12/2015.
*/
public class ActivityResultEvent {
private int requestCode;
private int resultCode;
private Intent data;
public ActivityResultEvent(int requestCode, int resultCode, Intent data) {
this.requestCode = requestCode;
this.resultCode = resultCode;
this.data = data;
}
public int getRequestCode() {
return requestCode;
}
public void setRequestCode(int requestCode) {
this.requestCode = requestCode;
}
public int getResultCode() {
return resultCode;
}
public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}
public Intent getData() {
return data;
}
public void setData(Intent data) {
this.data = data;
}
}
import android.os.Handler;
import android.os.Looper;
import com.squareup.otto.Bus;
/**
* Created by nuuneoi on 3/12/2015.
*/
public class ActivityResultBus extends Bus {
private static ActivityResultBus instance;
public static ActivityResultBus getInstance() {
if (instance == null)
instance = new ActivityResultBus();
return instance;
}
private Handler mHandler = new Handler(Looper.getMainLooper());
public void postQueue(final Object obj) {
mHandler.post(new Runnable() {
@Override
public void run() {
ActivityResultBus.getInstance().post(obj);
}
});
}
}
在活动中
public class MainActivity extends ActionBarActivity {
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ActivityResultBus.getInstance().postQueue(
new ActivityResultEvent(requestCode, resultCode, data));
}
...
}
最后,在片段中处理activityresult上的数据
public class BodyFragment extends Fragment {
...
@Override
public void onStart() {
super.onStart();
ActivityResultBus.getInstance().register(mActivityResultSubscriber);
}
@Override
public void onStop() {
super.onStop();
ActivityResultBus.getInstance().unregister(mActivityResultSubscriber);
}
private Object mActivityResultSubscriber = new Object() {
@Subscribe
public void onActivityResultReceived(ActivityResultEvent event) {
int requestCode = event.getRequestCode();
int resultCode = event.getResultCode();
Intent data = event.getData();
onActivityResult(requestCode, resultCode, data);
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Don't forget to check requestCode before continuing your job
if (requestCode == 12345) {
// Do your job
tvResult.setText("Result Code = " + resultCode);
}
}
...
}
希望这段代码能帮助任何人面对这个问题我想这将是索尼支持的问题。。。