Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何等待onActivityResult完成?_Android_Android Fragments_Android Bluetooth_Background Thread_Startactivityforresult - Fatal编程技术网

Android 如何等待onActivityResult完成?

Android 如何等待onActivityResult完成?,android,android-fragments,android-bluetooth,background-thread,startactivityforresult,Android,Android Fragments,Android Bluetooth,Background Thread,Startactivityforresult,我有一个片段,如果用户不批准蓝牙的激活,就不应该打开它,这是通过这段代码请求的 Intent mIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); mIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 240); startActivityForResult(mIntent, 1); //

我有一个片段,如果用户不批准蓝牙的激活,就不应该打开它,这是通过这段代码请求的

    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

您应该在启动intent后返回函数。然后等待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()
方法中,如果结果代码是
RESULT\u 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();
        }
    }
}

我认为您应该使用BroadcastReceiver注册一个事件。 在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>

您可以在此链接中看到更多信息:

这将不起作用,因为onActivityResult是异步的,这意味着调用片段不会等待结果,而是继续执行。如果我尝试从onActivityResult向屏幕添加一个新片段,将生成IllegalStateException。请发布代码和堆栈跟踪。这是处理这些请求的标准方法。发布后,请查看尝试以下操作:在onActivityResult中,将布尔值设置为true(以指示应该启动片段)。然后在onResume中检查布尔值,如果为true,则启动片段,并将值重置为false。问题是我从片段调用startActivityForResult,因此不会调用onSaveInstance或onResume(因为视图未暂停)查看堆栈跟踪
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;

....
}