Android:电池充电监视器无法在设备启动时自动启动

时间:2016-11-29 00:34:23

标签: android background-process battery autostart

我正在尝试编写电池监控应用程序,其功能之一是跟踪充电时间和与之相关的日期。

首先,我使用SharedPreferences在主活动类中编写了所有内容,并且它确实有效。但是,我希望即使在后台也能跟踪充值次数,所以我用谷歌搜索并认为WakefulBroadcastReceiver + IntentService可能是最有效/最简单的方法。

我错了。我坚持到这里,我认为我现在遇到的问题是显示器(IntentService部分)甚至没有启动!我想我可能在清单上写错了但我却找不到它。

这里是我的代码:

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobiledevices.batteryapp" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".BootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <service
        android:name=".RechargeMonitor"
        android:exported="false" />
</application>

BootReceiver.java

package com.mobiledevices.batteryapp;

import android.content.Intent;
import android.content.Context;
import android.support.v4.content.WakefulBroadcastReceiver;

public class BootReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent){
        Intent startServiceIntent = new Intent(context, RechargeMonitor.class);
        startWakefulService(context, startServiceIntent);
    }
}

RechargeMonitor.java

package com.mobiledevices.batteryapp;

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.content.SharedPreferences;
import android.os.BatteryManager;
import android.widget.Toast;

public class RechargeMonitor extends IntentService {

    public RechargeMonitor(){
        super("RechargeMonitor");
    }

    @Override
    protected void onHandleIntent(Intent intent){
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        this.registerReceiver(this.batteryinfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }

    private BroadcastReceiver batteryinfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT) &&
                    intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)!=0 &&
                    intent.getIntExtra(BatteryManager.EXTRA_STATUS, 0)==BatteryManager.BATTERY_STATUS_CHARGING){
                SharedPreferences settings = getSharedPreferences(MainActivity.PREF_NAME, 0);
                SharedPreferences.Editor editor = settings.edit();
                int count = settings.getInt("COUNT", 0);
                editor.putInt("COUNT", count+1);
                editor.commit();
            }
        }
    };
}

MainActivity.java太长了,所以我不在这里发布。但是,它不应该有任何问题,除非我必须在活动文件中调用BootReceiver / RechargeMonitor,我想我不需要,因为manifest + BootReciver应该处理自动启动,它甚至不成问题。

我现在遇到的问题再一次是RechargeMonitor似乎没有开始(我没有看到任何Toast消息。)

我要确定的另一件事是,只要我的名字正确,SharedPreferences应该可以在同一个应用程序中随处访问。我已经在好几个地方看到过,但我需要一个坚实的答案。

谢谢!

0 个答案:

没有答案