2013-03-28 70 views
0

调用服务类,我开发一个应用程序来监视网络详细信息.....这个我使用BrocastReceiver和服务组件...我的广播接收器被实例化设备启动和调用服务的类。 ..如何从广播接收器

服务类我正在获取的NetworkInfo,Signalstrength,纬度,经度和准确性,在对数据库中存储这些细节...

我的问题是: - 我能够创建数据库,但这些值都没有得到保存在DB ...

我的广播接收器类是: -

public class NetworkInfoListner extends BroadcastReceiver{ 

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

     PendingIntent service = null; 
     Intent intentForService = new Intent(context.getApplicationContext(), NetworkInfoService.class); 
     final AlarmManager alarmManager = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 
     final Calendar time = Calendar.getInstance(); 
     time.set(Calendar.MINUTE, 0); 
     time.set(Calendar.SECOND, 0); 
     time.set(Calendar.MILLISECOND, 0); 
     if (service == null) { 
      service = PendingIntent.getService(context, 0, 
        intentForService, PendingIntent.FLAG_CANCEL_CURRENT); 
     } 

     alarmManager.setRepeating(AlarmManager.RTC, time.getTimeInMillis(), 60000, service); 

    } 
} 

我的服务类: -

public class NetworkInfoService extends Service implements LocationListener{ 

    private String strNetworkInfo; 
    private LocationManager locationManager; 
    private double latitude; 
    private double longitude; 
    private double accuracy; 
    private int intSignalStrength; 
    private NetworkDetailsVO networkDetailsVO = new NetworkDetailsVO(); 
    private NetworkInfoDatabaseHelper networkInfoDatabaseHelper; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 


    } 

    @Override 
    public void onStart(Intent intent, int startId) { 

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

     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 

     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); 
     } 

     locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 300f, this); 

     telephonyManager.listen(new SignalStrengthDetector(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 

     networkDetailsVO.setNetworkInfo(strNetworkInfo); 
     networkDetailsVO.setPhoneNumber(telephonyManager.getLine1Number()); 
     networkDetailsVO.setOperatorName(telephonyManager.getNetworkOperatorName()); 
     networkDetailsVO.setSignalStrength(String.valueOf(intSignalStrength)); 
     networkDetailsVO.setLongitude(longitude); 
     networkDetailsVO.setLatitude(latitude); 
     networkDetailsVO.setAccuracy(accuracy); 


     networkInfoDatabaseHelper = new NetworkInfoDatabaseHelper(getApplicationContext()); 
     networkInfoDatabaseHelper.saveRecord(networkDetailsVO); 


    } 

    private String getNetworkStateString(NetworkInfo.State state){ 

     String stateString = "unknown"; 

     switch(state) 
     { 
     case CONNECTED: 
      stateString = "connected";    
      break; 

     case CONNECTING:   
      stateString = "connecting";  
      break; 

     case DISCONNECTED:  
      stateString = "disconnected"; 
      break; 

     case DISCONNECTING:  
      stateString = "disconnecting"; 
      break; 

     case SUSPENDED:   
      stateString = "suspended";    
      break; 

     default: 
      stateString = "unknown";  

      break; 

     } 

     return stateString; 
    } 


    @Override 
    public void onLocationChanged(Location location) { 

     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 
     accuracy = location.getAccuracy(); 

    } 


    @Override 
    public IBinder onBind(Intent intent) { 

     return null; 
    } 


    @Override 
    public void onProviderDisabled(String string) { 


    } 

    @Override 
    public void onProviderEnabled(String provider) { 

     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
    } 

    @Override 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 


    } 


    private class SignalStrengthDetector extends PhoneStateListener{ 

     @Override 
     public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
      super.onSignalStrengthsChanged(signalStrength); 
      intSignalStrength = signalStrength.getGsmSignalStrength(); 
     } 

    } 




} 

我的清单文件: -

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.networkinfodemo_v_03" 
    android:versionCode="1" 
    android:versionName="1.0" > 

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

    <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_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.networkinfodemo_v_03.activity.NetworkInfoActivity" 
      android:configChanges="orientation|keyboardHidden|screenSize" 
      android:label="@string/app_name" 
      android:theme="@style/FullscreenTheme" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name="com.pervazive.networkinfodemo_v_03.activity.service.NetworkInfoService" > 
     </service> 

     <receiver android:name="com.example.networkinfodemo_v_03.activity.broadcastreceiver.NetworkInfoListner" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <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> 

Helper类代码: -

public class NetworkInfoDatabaseHelper { 


    private NetworkInfoDatabaseOpenHelper networkInfoDatabaseOpenHelper; 
    private SQLiteDatabase sqLiteDatabase; 

    public static final String DATABASE_NAME = "networkInfo.db"; 
    public static final String TABLE_NAME = "networkinfo"; 
    public static final int DATABASE_VERSION = 2; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_NETWORK_INFO = "networkInfo"; 
    public static final String COLUMN_PHONE_NUMBER = "phonenumber"; 
    public static final String COLUMN_OPERATOR_NAME = "operatorname"; 
    public static final String COLUMN_SIGNAL_STRENGTH = "signalstrength"; 
    public static final String COLUMN_LATITUDE = "latitude"; 
    public static final String COLUMN_LONGITUDE = "longitude"; 
    public static final String COLUMN_ACCURACY = "accuracy"; 
    public static final String COLUMN_TIME = "time"; 





    public NetworkInfoDatabaseHelper(Context context) { 

     networkInfoDatabaseOpenHelper = new NetworkInfoDatabaseOpenHelper(context); 
     sqLiteDatabase = networkInfoDatabaseOpenHelper.getWritableDatabase(); 
    } 


    private class NetworkInfoDatabaseOpenHelper extends SQLiteOpenHelper{ 

     public NetworkInfoDatabaseOpenHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase sqLiteDatabase) { 

      sqLiteDatabase.execSQL("CREATE TABLE " + TABLE_NAME + "(" 
        + COLUMN_ID + " INTEGER PRIMARY KEY, " 
        + COLUMN_NETWORK_INFO + " TEXT, " 
        + COLUMN_PHONE_NUMBER + " TEXT, " 
        + COLUMN_OPERATOR_NAME + " TEXT, " 
        + COLUMN_SIGNAL_STRENGTH + " TEXT, " 
        + COLUMN_LATITUDE + " REAL, " 
        + COLUMN_LONGITUDE + " REAL, " 
        + COLUMN_ACCURACY + " REAL, " 
        + COLUMN_TIME + " TEXT) "); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 

      sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
      onCreate(sqLiteDatabase); 
     } 

    } 



public void saveRecord(NetworkDetailsVO networkDetailsVO){ 

     ContentValues contentValues = new ContentValues(); 

     contentValues.put(COLUMN_NETWORK_INFO, networkDetailsVO.getNetworkInfo()); 
     contentValues.put(COLUMN_PHONE_NUMBER, networkDetailsVO.getPhoneNumber()); 
     contentValues.put(COLUMN_OPERATOR_NAME, networkDetailsVO.getOperatorName()); 
     contentValues.put(COLUMN_SIGNAL_STRENGTH, networkDetailsVO.getSignalStrength()); 
     contentValues.put(COLUMN_LATITUDE, networkDetailsVO.getLongitude()); 
     contentValues.put(COLUMN_LONGITUDE, networkDetailsVO.getLatitude()); 
     contentValues.put(COLUMN_ACCURACY, networkDetailsVO.getDateTime()); 
     contentValues.put(COLUMN_TIME, networkDetailsVO.getDateTime()); 


     sqLiteDatabase.insert(TABLE_NAME, null, contentValues); 
    } 

    public Cursor getRecord(){ 

     return sqLiteDatabase.rawQuery(" SELECT * FROM " + TABLE_NAME, null); 
    } 

请让我知道了什么是错误

+0

你在你的'onReceive' ......我不明白调度报警。 – 2013-03-28 11:06:39

+0

嗨奥维迪乌Latcu,是的,我已经安排在一个的onReceive每Alaram分钟之后,调用该服务类....即我正在调用从广播接收器服务类每隔一分钟就会监视网络状态...我很存储结果存入数据库..(通过调用networkInfoDatabaseHelper.saveRecord(networkDetailsVO)方法)。 但不幸的是注意到被保存到数据库中......我不知道原因... :-( – 2013-03-28 11:23:14

+0

发布您的'networkInfoDatabaseHelper.saveRecord(...);'辅助类的方法的代码。 – GrIsHu 2013-03-28 11:44:27

回答

1

我做了类似的事情:

public class VoiceLaunchReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context ctx, Intent intent) {  
     Intent service = new Intent(ctx, VoiceLaunchService.class); 
     ctx.startService(service); 
     } 
    }