3

バッテリーの割合に基づいてプッシュ通知を受け取る機能を構築しようとしています。

シナリオ 1: バッテリーのパーセンテージが 30% から 40% の範囲に低下し、通知バーにメッセージが表示され、(通知によって) ユーザーのバッテリー残量が少ないことが通知されます。

私はサービスをしようとしましたが、役に立ちませんでした。BroadcastReceiver を取得してバッテリーの割合を取得し、通知をポップアップ表示することができましたが、サービスを機能させることができません。

MainActivity と BatteryService の 2 つのクラスがあります。

これは私がBatteryServiceクラスに入れたものです

public class BatteryService extends Service {

int level;
public BroadcastReceiver BatInfoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context arg0, Intent intent) {
        level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

        if (level == 50)
        {
            // Notify the user with notification
        }
    }
};

public void onCreate() {
    super.onCreate();
    this.registerReceiver(this.BatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(getApplicationContext(), "Command=" + level + "%", Toast.LENGTH_LONG).show();
    stopSelf();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(BatInfoReceiver);
}

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

次のようなエラーが発生しました

07-29 03:08:49.447: E/AndroidRuntime(1204): FATAL EXCEPTION: main
07-29 03:08:49.447: E/AndroidRuntime(1204): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000010 (has extras) } in app.bayer.notificationbattery.BatteryService$1@414bc4d8
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:765)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.os.Handler.handleCallback(Handler.java:615)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.os.Looper.loop(Looper.java:137)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.app.ActivityThread.main(ActivityThread.java:4745)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at java.lang.reflect.Method.invokeNative(Native Method)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at java.lang.reflect.Method.invoke(Method.java:511)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at dalvik.system.NativeStart.main(Native Method)
07-29 03:08:49.447: E/AndroidRuntime(1204): Caused by: java.lang.NullPointerException
07-29 03:08:49.447: E/AndroidRuntime(1204):     at app.bayer.notificationbattery.BatteryService$1.onReceive(BatteryService.java:25)
07-29 03:08:49.447: E/AndroidRuntime(1204):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:755)
07-29 03:08:49.447: E/AndroidRuntime(1204):     ... 9 more

サービスまたはブロードキャストレシーバーを間違って実行していますか?

編集:通知を行うために MainActivity に配置したメソッド。

public void buildNotification(Context context){
      NotificationManager notificationManager 
      = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
      Notification.Builder builder = new Notification.Builder(context);

      Intent intent = new Intent(context, MainActivity.class);
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

      builder
          .setSmallIcon(R.drawable.boostninja)
          .setContentTitle("Berocca Performance")
          .setContentText("Locate our store to charge your phone")
          .setTicker("Berocca Performance")
          .setLights(0xFFFF0000, 500, 500) //setLights (int argb, int onMs, int offMs)
          .setContentIntent(pendingIntent)
          .setAutoCancel(true);

      Notification notification = builder.build();
      notificationManager.notify(R.drawable.ic_launcher, notification);
 }
4

1 に答える 1

1

buildNotificationメソッドを新しいクラスに入れます。たとえば、あなたはそれを「Utils」と呼んでいます。

public class Utils {

public void buildNotification(Context context){...}

}

サービスから、そしてそれを抽出した元のアクティビティから、次のように呼び出します。

Utils utils = new Utils();
utils.buildNotification(<context argument goes in here>);

アクティビティからリファクタリングしたので、アクセスするためにアクティビティのオブジェクトを作成する必要はありません。

于 2013-07-29T07:50:17.323 に答える