【问题标题】:Running a BroadcastReceiver continuously in the background to monitor network status..在后台连续运行一个广播接收器来监控网络状态。
【发布时间】:2013-03-09 13:52:30
【问题描述】:

我正在编写一个 android 应用程序以在每分钟后在后台持续监控网络...我正在使用 BroadcastReceiver...它在启动完成时启动...在 BroadcastReceiver 内部我正在执行以下操作东西

       a. Monitor Network
       b. check signal strength
       c. fetch longitude and latitude
       d. fetch phonenumber 
       e. fetch operatorname

     and i am saving all the above information into a Database table....

但不幸的是,当我在 android 设备上安装和运行它时,这个应用程序给了我一些错误

我的 BroadcastReceiver 代码是:-

public class NetworkInfoReceiver extends BroadcastReceiver{

    private NetworkInfoVO networkInfoVO = new NetworkInfoVO();
    private String strNetworkInfo = QualityofServiceConstants.DEFAULT_NETWORK_INFO;
    private SignalStrengthPhoneStateListner signalStrengthPhoneStateListner =  new SignalStrengthPhoneStateListner();

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Started", Toast.LENGTH_SHORT).show();


        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

                //Check Network status here
        if(networkInfo!=null && networkInfo.isConnected()){
            String networkState = getNetworkStateString(networkInfo.getState());
            String stateString = networkInfo.toString().replace(',', '\n');
            strNetworkInfo = String.format("Network Type: %s\n Network State: %s\n\n %s",
            networkInfo.getTypeName(),networkState,stateString);
        }

                //check signal strength here
        telephonyManager.listen(signalStrengthPhoneStateListner, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

        networkInfoVO.setNetworkInfo(strNetworkInfo);
                //get phonenumber here
        networkInfoVO.setPhoneNumber(telephonyManager.getLine1Number());
                //get operator name here
        networkInfoVO.setServiceProvider(telephonyManager.getNetworkOperatorName());
//get signal strength here      networkInfoVO.setSignalStrength(signalStrengthPhoneStateListner.getSignalStrengths());
                //get latitude here
        networkInfoVO.setLatitude(String.valueOf(getGPS(context).getLatitude()));
                //get longitude here
        networkInfoVO.setLongitude(String.valueOf(getGPS(context).getLongitude()));
        networkInfoVO.setTime(new Date().toString());

        new NetworkInfoDatabaseHelper(context).saveRecord(networkInfoVO);

        try {
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    private String getNetworkStateString(NetworkInfo.State state){

        String stateString = QualityofServiceConstants.NETWORK_STATE_UNKNOWN;

        switch(state)
        {
        case CONNECTED: 
            stateString = QualityofServiceConstants.NETWORK_STATE_CONNECTED;             
            break;

        case CONNECTING:        
            stateString = QualityofServiceConstants.NETWORK_STATE_CONNECTING;    
            break;

        case DISCONNECTED:      
            stateString = QualityofServiceConstants.NETWORK_STATE_DISCONNECTED;  
            break;

        case DISCONNECTING:     
            stateString = QualityofServiceConstants.NETWORK_STATE_DISCONNECTING;  
            break;

        case SUSPENDED:         
            stateString = QualityofServiceConstants.NETWORK_STATE_SUSPENDED;              
            break;

        default: 
            stateString = QualityofServiceConstants.NETWORK_STATE_UNKNOWN;     

            break;

        }

        return stateString;
    }


    private Location getGPS(Context context){

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        List<String>providers = locationManager.getProviders(true);
        Location location = null;

        for (int i = providers.size()-1; i >= 0; i--){
            location = locationManager.getLastKnownLocation(providers.get(i));
            if(location!=null)
                break;
        }

        return location;
    }

    private class SignalStrengthPhoneStateListner extends PhoneStateListener{

        private String signalStrengths;

        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);

            if(signalStrength.getGsmSignalStrength() > 30){
                signalStrengths = "Signal Strength :" + signalStrength.getGsmSignalStrength() + " Good";
            }else if(signalStrength.getGsmSignalStrength() > 20 && signalStrength.getGsmSignalStrength() < 30){
                signalStrengths = "Signal Strength : " + signalStrength.getGsmSignalStrength() + " Average";
            }else if(signalStrength.getGsmSignalStrength() < 20){
                signalStrengths = "Signal Strength : " + signalStrength.getGsmSignalStrength() + " Weak";
            }

        }

        public String getSignalStrengths() {
            return signalStrengths;
        }

    }

}

我的清单文件是:-

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="compervazive.lognetworkinfo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name="com.example.qos.broadcastreceiver.NetworkInfoReceiver" >
            <intent-filter>
                <action android:name="android.intent.action._BOOT_COMPLETED"/>
                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                 <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
                 <action android:name="android.net.wifi.STATE_CHANGE"/>
                 <action android:name="android.intent.action.SIG_STR"/>                                                                                                                                     
            </intent-filter>

        </receiver>
    </application>

</manifest>

请让我知道这是什么问题....感谢您的时间:-)

【问题讨论】:

  • 您遇到什么错误?
  • 你想让我们猜测错误是什么或什么?
  • 应用程序未安装...我希望您查看清单文件...如果所有权限和意图过滤器都正确,请告诉我...
  • 是否给出了未安装的原因?
  • application not getting installed 是什么意思?您在安装应用程序时是否看到任何错误或它没有显示在启动器中?它没有出现在启动器中的原因是因为您的清单中没有任何启动器活动。

标签: android broadcastreceiver intentfilter android-location android-networking


【解决方案1】:
Thread.sleep(60000);

这是一个非常糟糕的主意,删除它并重新阅读 BroadcastReceiver 的文档。也许会有所帮助。

此外,您的清单中没有任何活动。添加至少一个主要的启动器活动。任何应用都必须至少有一个。

附:向我们提供有关您遇到的错误的更多信息。

【讨论】:

    【解决方案2】:
    android.intent.action._BOOT_COMPLETED
    

    应该是

    android.intent.action.BOOT_COMPLETED
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多