Android 使用服务执行操作-异步任务
我在创建的库模块中设置了一个绑定服务 如果这不是一个库模块,我的问题会很简单,因为我需要为其他人提供动态的东西 当前的应用程序使用库模块在两部手机之间通过Wifi直接搜索和创建连接(到目前为止没有问题) 我现在的问题是,我的应用程序(我正在测试以确保库模块没有丢失任何内容)不知道两部手机何时“连接” 我已经尝试了一个while循环来不断请求内容和循环,直到它不为null,这在技术上可以工作吗?然而,我在这方面运气不佳 我想实现一个等待功能,但这将是最后的手段 我正在使用android指南创建我的库Android 使用服务执行操作-异步任务,android,android-wifi,android-library,Android,Android Wifi,Android Library,我在创建的库模块中设置了一个绑定服务 如果这不是一个库模块,我的问题会很简单,因为我需要为其他人提供动态的东西 当前的应用程序使用库模块在两部手机之间通过Wifi直接搜索和创建连接(到目前为止没有问题) 我现在的问题是,我的应用程序(我正在测试以确保库模块没有丢失任何内容)不知道两部手机何时“连接” 我已经尝试了一个while循环来不断请求内容和循环,直到它不为null,这在技术上可以工作吗?然而,我在这方面运气不佳 我想实现一个等待功能,但这将是最后的手段 我正在使用android指南创建我的
实际问题 我正在尝试获取要显示给用户的连接信息,显然,如果连接尚未建立,它将为空!因此给我带来了很多问题 我找到的一个解决方案是单步执行并手动等待,直到另一部手机接受连接并成功连接,然后继续请求信息等
请让我知道如果有任何问题,因为这是非常困惑我知道 更新:当库检测到成功的P2P连接时,您将希望在库中使用sendBroadcast()向应用程序发送意图。只有在当前有活动打开的情况下,您才可能希望在应用程序中接收该意图。请参见下面的新代码:
@Override
public void onResume() {
super.onResume();
IntentFilter iFilter= new IntentFilter("com.yourapp.example.P2PCONNECTED");
//iFilter.addAction("someOtherAction"); //if you want to add other actions to filter
this.registerReceiver(br, iFilter);
}
@Override
public void onPause() {
this.unregisterReceiver(br);
super.onPause();
}
private BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("com.yourapp.example.P2PCONNECTED")){
this.runOnUiThread(mUpdateP2PStatus);
}
}
};
private final Runnable mUpdateP2PStatus= new Runnable() {
@Override
public void run() {
//TODO: Update your UI here
}
};
请注意,这是在建立P2P连接的情况下添加的,请注意,您应该用包名替换com.yourapp.example
:
Intent i = new Intent("com.yourapp.example.P2PCONNECTED");
context.sendBroadcast(i);
用于在库中定义BroadcastReceiver的代码:
WiFiDirectFilter = new IntentFilter(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
WiFiDirectFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
WiFiDirectFilterBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i("MyApp", action);
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
Log.i("MyApp", "WifiDirect WIFI_P2P_STATE_CHANGED_ACTION Enabled: true");
//WiFi Direct Enabled
//Do something....
}
else {
Log.i("MyApp", "WifiDirect WIFI_P2P_STATE_CHANGED_ACTION Enabled: false");
//WiFi Direct not enabled...
//Do something.....
}
}
else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if(networkInfo != null) {
boolean isWiFiDirectConnected = networkInfo.isConnected();
Log.i("MyApp", "WifiDirect WIFI_P2P_CONNECTION_CHANGED_ACTION Connected: " + );
if (isWiFiDirectConnected){
//WiFi Direct connected!
//Send Broadcast to your app
Intent i = new Intent("com.yourapp.example.P2PCONNECTED");
context.sendBroadcast(i);
}
else{
//WiFi Direct not connected
//Do something
}
}
}
}
};
然后,在应用程序中的任何活动或片段中,您都需要在onResume()中注册并在onPause()中注销,请参见下面的代码:
@Override
public void onResume() {
super.onResume();
IntentFilter iFilter= new IntentFilter("com.yourapp.example.P2PCONNECTED");
//iFilter.addAction("someOtherAction"); //if you want to add other actions to filter
this.registerReceiver(br, iFilter);
}
@Override
public void onPause() {
this.unregisterReceiver(br);
super.onPause();
}
private BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("com.yourapp.example.P2PCONNECTED")){
this.runOnUiThread(mUpdateP2PStatus);
}
}
};
private final Runnable mUpdateP2PStatus= new Runnable() {
@Override
public void run() {
//TODO: Update your UI here
}
};
是的,这是正确的,我已经在我的库中实现了这一点,问题是如何动态回调?要让用户知道连接成功,请单击“啊,好”。您可能希望从库中发送自己的广播,并使用应用程序中的广播接收器接收广播。看到这篇帖子:嗨,再次为这件事感到抱歉,我现在有时间来看看这件事,这就是我要寻找的答案,但是我不知道到底要实现什么。。。我觉得应该保留我的主广播接收器,并在我使用的每个活动中重新注册它?当然不是?还是为每个活动创建另一个广播接收器来接听这些呼叫?还请注意我使用的是绑定服务和碎片!您好,我更新了答案,告诉您我认为它是如何工作的。我还没有用库/应用程序场景对此进行测试,因此您可能需要修改,但希望它能让您走上正确的轨道。是的,这会解决问题,但我遇到了一个问题,因为我正在扩展片段,我无法扩展广播接收器。。。有什么建议吗?我如何实现接口,因为这是我找到的唯一解决方案。