Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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
Java 关闭应用程序时如何断开与设备的连接?_Java_Android_Wifi Direct - Fatal编程技术网

Java 关闭应用程序时如何断开与设备的连接?

Java 关闭应用程序时如何断开与设备的连接?,java,android,wifi-direct,Java,Android,Wifi Direct,我正在安卓工作室做一个项目,我打算用Wifi直接连接两台设备 我已通过Wifi direct连接到另一台设备。我的问题是,当我在手机上手动关闭应用程序时,设备不会断开连接。我怎样才能做到这一点?我对Android Studio和java非常陌生 这是我的WifiDirectActivity课程: public class WiFiDirectActivity extends Activity implements WifiP2pManager.ChannelListener, DeviceLis

我正在安卓工作室做一个项目,我打算用Wifi直接连接两台设备

我已通过Wifi direct连接到另一台设备。我的问题是,当我在手机上手动关闭应用程序时,设备不会断开连接。我怎样才能做到这一点?我对Android Studio和java非常陌生

这是我的WifiDirectActivity课程:

public class WiFiDirectActivity extends Activity implements WifiP2pManager.ChannelListener, DeviceListFragment.DeviceActionListener {

public static final String TAG = "wifidirectdemo";
private WifiP2pManager manager;
private boolean isWifiP2pEnabled = false;
private boolean retryChannel = false;

private final IntentFilter intentFilter = new IntentFilter();
private WifiP2pManager.Channel channel;
private BroadcastReceiver receiver = null;

/**
 * @param isWifiP2pEnabled the isWifiP2pEnabled to set
 */
public void setIsWifiP2pEnabled(boolean isWifiP2pEnabled) {
    this.isWifiP2pEnabled = isWifiP2pEnabled;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_peers);

    // add necessary intent values to be matched.

    intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(this, getMainLooper(), null);

}

/** register the BroadcastReceiver with the intent values to be matched */

@Override
public void onResume() {

    super.onResume();
    receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
    registerReceiver(receiver, intentFilter);
    if (!amConnected) {
        performSearch();
    }
    }



@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

/**
 * Remove all peers and clear all fields. This is called on
 * BroadcastReceiver receiving a state change event.
 */
public void resetData() {
    DeviceListFragment fragmentList = (DeviceListFragment) getFragmentManager()
            .findFragmentById(R.id.frag_list);
    DeviceDetailFragment fragmentDetails = (DeviceDetailFragment) getFragmentManager()
            .findFragmentById(R.id.frag_detail);
    if (fragmentList != null) {
        fragmentList.clearPeers();
    }
    if (fragmentDetails != null) {
        fragmentDetails.resetViews();
    }
}

@Override
public void showDetails(WifiP2pDevice device) {
    DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
            .findFragmentById(R.id.frag_detail);
    fragment.showDetails(device);

}

@Override
public void connect(WifiP2pConfig config) {
    manager.connect(channel, config, new WifiP2pManager.ActionListener() {

        @Override
        public void onSuccess() {
            // WiFiDirectBroadcastReceiver will notify us. Ignore for now.
        }

        @Override
        public void onFailure(int reason) {
            Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",
                    Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public void disconnect() {
    final DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
            .findFragmentById(R.id.frag_detail);
    fragment.resetViews();
    manager.removeGroup(channel, new WifiP2pManager.ActionListener() {

        @Override
        public void onFailure(int reasonCode) {
            Log.d(TAG, "Disconnect failed. Reason :" + reasonCode);


        }

        @Override
        public void onSuccess() {
            fragment.getView().setVisibility(View.GONE);

        }

    });
}

@Override
public void onChannelDisconnected() {
    // we will try once more
    if (manager != null && !retryChannel) {
        Toast.makeText(this, "Channel lost. Trying again", Toast.LENGTH_LONG).show();
        resetData();
        retryChannel = true;
        manager.initialize(this, getMainLooper(), this);
    } else {
        Toast.makeText(this,
                "Severe! Channel is probably lost premanently. Try Disable/Re-Enable P2P.",
                Toast.LENGTH_LONG).show();
    }
}

@Override
public void cancelDisconnect() {

    /*
     * A cancel abort request by user. Disconnect i.e. removeGroup if
     * already connected. Else, request WifiP2pManager to abort the ongoing
     * request
     */
    if (manager != null) {
        final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
                .findFragmentById(R.id.frag_list);
        if (fragment.getDevice() == null
                || fragment.getDevice().status == WifiP2pDevice.CONNECTED) {
            disconnect();
        } else if (fragment.getDevice().status == WifiP2pDevice.AVAILABLE
                || fragment.getDevice().status == WifiP2pDevice.INVITED) {

            manager.cancelConnect(channel, new WifiP2pManager.ActionListener() {

                @Override
                public void onSuccess() {
                    Toast.makeText(WiFiDirectActivity.this, "Aborting connection",
                            Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(int reasonCode) {
                    Toast.makeText(WiFiDirectActivity.this,
                            "Connect abort request failed. Reason Code: " + reasonCode,
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

}


private void performSearch() {



    final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
            .findFragmentById(R.id.frag_list);
    fragment.onInitiateDiscovery();
    manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {

        @Override
        public void onSuccess() {
            Toast.makeText(WiFiDirectActivity.this, "Discovery Initiated",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(int reasonCode) {
            Toast.makeText(WiFiDirectActivity.this, "Discovery Failed : " + reasonCode,
                    Toast.LENGTH_SHORT).show();
        }

    });
}

}

当您关闭应用程序时,执行将通过
onPause()
回调运行,您应该在那里调用
disconnect()
方法。然而,花5分钟的时间来理解Android的生命周期原则:。这是开发Android应用程序之前首先要学习的内容之一。

当您关闭应用程序时,执行将通过
onPause()
回调运行,在那里您应该调用
disconnect()
方法。然而,花5分钟的时间来理解Android的生命周期原则:。这是开发Android应用程序之前首先要学习的内容之一。

谢谢你的回答,当应用程序完全终止时,这是否有效?因为我不希望它在我转到其他活动时断开连接,只有在我关闭应用程序时。谢谢你的链接,我知道我缺乏很多基础知识。说到这个项目,我可能会有点不知所措。然后你可能需要onStop()回调,或者你应该创建一个具有connect和diconnect函数的持久控制器类,这样你就可以将这个类的活动传递给另一个,在onStop()中你可以调用controller.disconnect()。谢谢你的回答,当应用程序完全终止时,这是否起作用?因为我不希望它在我转到其他活动时断开连接,只有在我关闭应用程序时。谢谢你的链接,我知道我缺乏很多基础知识。说到这个项目,我可能会有点不知所措。然后您可能需要onStop()回调,或者您应该创建一个具有connect和diconnect函数的持久控制器类,这样您就可以将该类的活动传递给另一个,并在onStop()中调用controller.disconnect()。