使用Service执行操作 - 异步任务

时间:2015-03-03 19:57:48

标签: android android-wifi android-library

我有一个已在我创建的库模块中设置的绑定服务。

如果这不是一个库模块,我的问题会很简单,因为我需要为其他人提供动态的东西。

当前应用程序使用库模块在两部手机之间通过Wifi-Direct搜索和创建连接(到目前为止没有问题)。

我的问题现在是我的应用程序(我正在测试以确保库模块没有遗漏任何东西)不知道这两部手机何时连接了#34;。

我已经尝试了一个while循环来继续请求内容并循环直到它不为null,这在技术上会起作用吗?但是我没有运气。

我在考虑实现等待功能,但这是最后的手段!

我正在使用android指南创建我的库Link


实际问题

我正在尝试获取有关显示给用户的连接的信息,显然如果尚未建立连接,它将为null!从而导致我的问题。

我找到的一个解决方案是逐步完成并手动等待,直到另一部手机接受连接并成功连接,然后继续请求信息等。

如果有任何问题请告诉我,因为我知道这很麻烦!

1 个答案:

答案 0 :(得分:1)

更新:当您的库检测到成功的P2P连接时,您将希望在库中使用sendBroadcast()向您的应用发送意图。仅当有活动当前打开时,您可能希望在应用中收到意图。请参阅以下新代码:

看到这已添加到已建立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                        
    }
};