如何等待onActivityResult完成?
我如果用户不同意蓝牙,它通过这段代码要求的激活不应该打开一个片段如何等待onActivityResult完成?
Intent mIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
mIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 240);
startActivityForResult(mIntent, 1);
//Here I want to exit the method in case result is denied
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.content,new ServerFragment()).addToBackStack(null).commit();
我一直在寻找在相当多的地方,唯一的我发现的事情是使用新活动的setResult(在我的情况下,onActivityResult在调用活动中被覆盖,因为此代码在一个片段内)
任何想法?
谢谢!
编辑:这里有一个堆栈跟踪
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131073, result=240, data=null} to activity {bt.bt/bt.bt.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.deliverResults(ActivityThread.java:3659)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3702)
at android.app.ActivityThread.access$1300(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1366)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
你应该只返回你的函数启动意图之后。然后等待onActivityResult中的回调。在这种方法中,如果结果是RESULT_OK,那么你会开始你的片段。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == your_request_code_here) {
if (resultCode != Activity.RESULT_CANCELED) {
// start fragment
}
}
}
全部活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent mIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
mIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 240);
startActivityForResult(mIntent, 1);
}
});
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode != Activity.RESULT_CANCELED) {
}
}
}
}
正如你所粘贴代码,您只要你叫startActivityForResult()
实例的片段,你不需要做 - 这是造成问题。你只需要startActivityForResult()
,然后在你的活动你onActivityResult()
方法,你可以实例化你的片段,如果resultCode为是RESULT_OK
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == your_request_code_here) {
if (resultCode == Activity.RESULT_OK) {
getSupportFragmentManager().beginTransaction().replace(R.id.content,new ServerFragment()).addToBackStack(null).commit();
}
}
}
查看堆栈跟踪 – Stefan
我认为你应该使用广播接收器注册事件蓝牙。 在你的Manifest.xml,你需要添加两个声明:
<uses-permission android:name="android.permission.BLUETOOTH" />
<receiver android:name=".BluetoothBroadcastReceiver"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
</intent-filter>
</receiver>
然后,你需要实现的onReceive()方法:
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("BroadcastActions", "Action "+action+"received");
int state;
BluetoothDevice bluetoothDevice;
switch(action)
{
case BluetoothAdapter.ACTION_STATE_CHANGED:
state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
if (state == BluetoothAdapter.STATE_OFF)
{
Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is off");
}
else if (state == BluetoothAdapter.STATE_TURNING_OFF)
{
Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is turning off");
}
else if(state == BluetoothAdapter.STATE_ON)
{
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.content,new ServerFragment()).addToBackStack(null).commit();
Log.d("BroadcastActions", "Bluetooth is on");
}
break;
....
}
你可以看到更多的在这个环节:Android Broadcast Receiver bluetooth events catching
这是行不通的,因为onActivityResult是异步的,这意味着调用片段不会等待结果,它会继续执行。如果我尝试从onActivityResult向屏幕添加新片段,则会生成IllegalStateException。 – Stefan
请发布您的代码和堆栈跟踪。这是处理这些请求的标准方式。 – Francesc
发表了它,看一看 – Stefan