sendwakefulwork并非总是使用CWAC-Wakeful-1.1.0打电话



我已经有很长时间了,我发现了CWAC-Wakeful,这可以解决我的所有问题。我想... :'(简而言之,为了解决问题,我已经实施了一个最简单的应用程序,该应用程序每60秒钟安排一次警报并每次记录。这是我的代码:

主动脉:

package com.par.hasard.mysimpleapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.myExportButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyLogManager.copyLogToClipboard(view.getContext());
                MyLogManager.emptyLogFile(view.getContext());
            }
        });
        try {
            MyLogManager.createLogFile(this);
            MyLogManager.write(this, "Application launchedn");
            MyAlarmPlanner.planAlarm_v2(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

myalarmplanner:

package com.par.hasard.mysimpleapplication;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.widget.Toast;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.io.IOException;
public class MyAlarmPlanner {
    public static void planAlarm_v2(Context context) throws IOException {
        MyLogManager.write(context, "Beginning of planAlarm_v2n");
        WakefulIntentService.scheduleAlarms(new MyAppListener(), context, true);
        MyLogManager.write(context, "End of planAlarm_v2n");
    }
}

myAppListener:

package com.par.hasard.mysimpleapplication;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.os.SystemClock;
import com.commonsware.cwac.wakeful.AlarmReceiver;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.io.IOException;
public class MyAppListener implements WakefulIntentService.AlarmListener {
    @Override
    public void scheduleAlarms(AlarmManager alarmManager, PendingIntent pendingIntent, Context context) {
        try {
            MyLogManager.write(context, "Beginning of scheduleAlarmsn");
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+60000, pendingIntent);
            MyLogManager.write(context, "End of scheduleAlarmsn");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void sendWakefulWork(Context context) {
        try {
            MyLogManager.write(context, "Beginning of sendWakefulWorkn");
            WakefulIntentService.sendWakefulWork(context, MyAppService.class);
            MyLogManager.write(context, "End of sendWakefulWorkn");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public long getMaxAge(Context context) {
        return (AlarmManager.INTERVAL_FIFTEEN_MINUTES * 2);
    }
}

myAppService:

package com.par.hasard.mysimpleapplication;
import android.content.Intent;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.io.IOException;
public class MyAppService extends WakefulIntentService {
    public MyAppService(){
        super("MyAppService");
    }
    @Override
    protected void doWakefulWork(Intent intent) {
        try {
            MyLogManager.write(this, "Beginning of doWakefulWorkn");
            MyAlarmPlanner.planAlarm_v2(this);
            MyLogManager.write(this, "End of doWakefulWorkn");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.par.hasard.mysimpleapplication">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <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="com.par.hasard.mysimpleapplication.MySimpleWakefulReceiver">
            <intent-filter android:priority="1">
                <action android:name="com.par.hasard.mysimpleapplication.REGULAR_ALARM" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.commonsware.cwac.wakeful.AlarmReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
            <meta-data
                android:name="com.commonsware.cwac.wakeful"
                android:resource="@xml/wakeful"/>
        </receiver>
        <service android:enabled="true" android:name="com.par.hasard.mysimpleapplication.MySimpleWakefulService" />
        <service android:enabled="true" android:name="com.par.hasard.mysimpleapplication.MyAppService" />
    </application>
</manifest>

wawsful.xml:

<WakefulIntentService
    listener="com.par.hasard.mysimpleapplication.MyAppListener"
    />

所有这些都可以很好地工作,但是有时它不会记录任何内容。我认为这是由于我的手机睡眠模式(索尼Xperia)。但是在其他手机上似乎具有相同的行为。这是日志的示例:

18/12 2h47m37s304 => Beginning of sendWakefulWork
18/12 2h47m37s311 => End of sendWakefulWork
18/12 2h47m37s316 => Beginning of doWakefulWork
18/12 2h47m37s317 => Beginning of planAlarm_v2
18/12 2h47m37s320 => Beginning of scheduleAlarms
18/12 2h47m37s322 => End of scheduleAlarms
18/12 2h47m37s323 => End of planAlarm_v2
18/12 2h47m37s324 => End of doWakefulWork
18/12 2h48m37s332 => Beginning of sendWakefulWork
18/12 2h48m37s338 => End of sendWakefulWork
18/12 2h48m37s347 => Beginning of doWakefulWork
18/12 2h48m37s348 => Beginning of planAlarm_v2
18/12 2h48m37s350 => Beginning of scheduleAlarms
18/12 2h48m37s351 => End of scheduleAlarms
18/12 2h48m37s352 => End of planAlarm_v2
18/12 2h48m37s353 => End of doWakefulWork
18/12 3h35m6s293 => Beginning of sendWakefulWork    //nothing before ??
18/12 3h35m6s298 => End of sendWakefulWork
18/12 3h35m6s319 => Beginning of doWakefulWork
18/12 3h35m6s327 => Beginning of planAlarm_v2
18/12 3h35m6s331 => Beginning of scheduleAlarms
18/12 3h35m6s338 => End of scheduleAlarms
18/12 3h35m6s340 => End of planAlarm_v2
18/12 3h35m6s345 => End of doWakefulWork
18/12 3h36m7s307 => Beginning of sendWakefulWork
18/12 3h36m7s313 => End of sendWakefulWork
18/12 3h36m7s319 => Beginning of doWakefulWork
18/12 3h36m7s320 => Beginning of planAlarm_v2
18/12 3h36m7s322 => Beginning of scheduleAlarms
18/12 3h36m7s323 => End of scheduleAlarms
18/12 3h36m7s324 => End of planAlarm_v2
18/12 3h36m7s325 => End of doWakefulWork

有人可以帮我吗?

就时间间隙而言,很可能是在Android 6.0 设备上遇到打doe模式,或者某些制造商在较旧设备上提供的等效产品(例如,索尼的耐力模式)。除了将您的应用程序添加到适当的白名单(例如,为打dos,设置> Apps>(Gear Icon)>特殊访问>优化电池)之外,您几乎无法做到。

欢迎您切换到API级别23 设备上的setExactAndAllowWhileIdle(),但是:

  • 您不会每分钟得到控制(我认为它仅限于每9分钟)

  • 当您获得控制时,您将无法获得Internet访问(可能是您尝试实现的任何方法所必需的)

  • 这对制造商特定的Pre-6.0设备无济于事(因为该方法不存在)

总体而言,设计您的应用程序来处理打ze模式,并且不认为它将在后台得到太多的控制,这是一种更可靠的方法。

最新更新