0

我正在尝试使用Service来监视当前的电池状态。我写了一些代码,我可以使用日志显示电池电量一次,但我想每5秒钟根据计时器监视电池电量。从服务器监视电池电量

public class ServiceStatusUpdate extends Service { 
    GPSTracker gps; 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     while (true) { 
      new Handler().postDelayed(new Runnable() { 
       public void run() { 
        batteryLevel(); 
        Log.e("Status changed", "Status changed"); 
       } 
      }, 5000); 
      return START_STICKY; 
     } 
    } 

    private void batteryLevel() { 
     BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() { 
      public void onReceive(Context context, Intent intent) { 
       context.unregisterReceiver(this); 
       int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
       int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
       int level = -1; 
       if (rawlevel >= 0 && scale > 0) { 
        level = (rawlevel * 100)/scale; 
       } 
       Log.e("Batarry status iss", level + "mm"); 
      } 
     }; 
     IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     registerReceiver(batteryLevelReceiver, batteryLevelFilter); 
     return; 
    } 
} 

MainActivity.java

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     startService(new Intent(this, ServiceStatusUpdate.class)); 
    } 
} 

manifest.xml源:

<receiver 
     android:name=".OnBootReceiver" 
     android:enabled="true" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name=".ServiceStatusUpdate" 
     android:enabled="true" /> 

OnBootReceiver

public class OnBootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 
      //int batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
      Intent serviceLauncher = new Intent(context, ServiceStatusUpdate.class); 

      context.startService(serviceLauncher); 
     } 
    } 
} 

我也试图发送一个HTTP请求每/ XXX倍。 HTTP请求将包含一些文本,电池状态和经度和纬度。

我知道如何发送带有参数的要求,但我的服务工作只有一次。

回答

0

您接收到广播后第一时间注销batteryLevelReceiver。从onReceive删除此行继续接收广播:

context.unregisterReceiver(this); 

而且,你可能只需要注册并创建服务器时一旦注销你的广播接收器/破坏,所以你应该在onCreate注册和onDestroy注销。

下面是一些代码,应该是非常接近你想要什么。请注意,所有这些将在当前的UI线程上运行。

public class ServiceStatusUpdate extends Service { 

    private static final int CHECK_BATTERY_INTERVAL = 5000; 

    private GPSTracker gps; 
    private double batteryLevel; 
    private Handler handler; 

    private BroadcastReceiver batInfoReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent batteryIntent) { 
      int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
      int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 

      if (rawlevel >= 0 && scale > 0) { 
       batteryLevel = (rawlevel * 100.0)/scale; 
      } 

      Log.e("Battery status is", batteryLevel + "mm"); 
     } 
    }; 

    private Runnable checkBatteryStatusRunnable = new Runnable() { 
     @Override 
     public void run() { 
      //DO WHATEVER YOU WANT WITH LATEST BATTERY LEVEL STORED IN batteryLevel HERE... 

      // schedule next battery check 
      handler.postDelayed(checkBatteryStatusRunnable, CHECK_BATTERY_INTERVAL); 
      Log.e("Battery status is", batteryLevel + "mm cached"); 
     } 
    }; 

    @Override 
    public void onCreate() { 
     handler = new Handler(); 
     handler.postDelayed(checkBatteryStatusRunnable, CHECK_BATTERY_INTERVAL); 
     registerReceiver(batInfoReceiver, 
       new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 

    @Override 
    public void onDestroy() { 
     unregisterReceiver(batInfoReceiver); 
     handler.removeCallbacks(checkBatteryStatusRunnable); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 
} 
+0

我更新了我的MainActivity.java源。 PS我删除batteryLevel方法和Log.e状态更改messige只显示一次 – BekaKK

+0

我想检查每XXX时间battary状态通过服务 – BekaKK

+0

那么这是不同于你最初问。给我一分钟,我会更新答案。 –