要保持WiFi Direct连接在Android应用程序被关闭时保持打开状态,可以使用Service来实现。
首先,在AndroidManifest.xml文件中添加以下权限:
然后,创建一个继承自Service的类,例如WifiDirectService:
public class WifiDirectService extends Service {
private static final String TAG = "WifiDirectService";
private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private WifiDirectBroadcastReceiver mReceiver;
private IntentFilter mIntentFilter;
@Override
public void onCreate() {
super.onCreate();
// 初始化WifiP2pManager和WifiP2pManager.Channel
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
// 初始化BroadcastReceiver和IntentFilter
mReceiver = new WifiDirectBroadcastReceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 注册BroadcastReceiver
registerReceiver(mReceiver, mIntentFilter);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
// 解除注册BroadcastReceiver
unregisterReceiver(mReceiver);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class WifiDirectBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null) {
switch (action) {
case WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION:
// WiFi Direct状态改变
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
Log.d(TAG, "WiFi Direct已启用");
} else {
Log.d(TAG, "WiFi Direct已禁用");
}
break;
case WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION:
// WiFi Direct可用对等点列表改变
// 更新可用对等点列表
break;
case WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION:
// WiFi Direct连接状态改变
NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo != null && networkInfo.isConnected()) {
// 连接成功
Log.d(TAG, "已连接到WiFi Direct设备");
} else {
// 连接断开
Log.d(TAG, "已断开WiFi Direct连接");
}
break;
case WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:
// 当前设备的WiFi Direct信息改变
// 更新当前设备的信息
break;
}
}
}
}
}
最后,在你的应用程序的MainActivity或其他地方启动和停止WifiDirectService:
public class MainActivity extends AppCompatActivity {
private Intent mServiceIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动WifiDirectService
mServiceIntent = new Intent(this, WifiDirectService.class);
startService(mServiceIntent);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 停止WifiDirectService
stopService(mServiceIntent);
}
}
这样,即使你的应用程序被关闭,WifiDirectService仍然在后台运行,保持WiFi Direct连接的打开状态。