如何创建后台应用程序(服务)以每30秒获取一次移动数据。该服务必须全天候工作

时间:2017-01-05 03:43:31

标签: android service timer

目前,自设备启动以来,我设法通过移动网络每30秒接收/传输一次。

Timer: -

Timer mTimer = new Timer();
mTimer.scheduleAtFixedRate(mTimeTask, 0, AppConstants.DATA_TRACKING_PERIOD);

private TimerTask mTimeTask = new TimerTask() {
        @Override
        public void run() {
           long currentRx = TrafficStats.getMobileRxBytes();
           long currentTx = TrafficStats.getMobileTxBytes();
        }
    }
};

Service: -

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (isInstanceCreated()) {
        if(!mSocket.connected()){
           connectConnection();
        }
        return START_STICKY;
    }
    super.onStartCommand(intent, flags, startId);
    connectConnection();
    //Timer starts from here
    mTrafficHelper.startTracking();    
    return START_STICKY;
}

AndroidManifest.xml: -

<!-- Access network/ Internet connection permission -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service android:name=".services.MyService"
         android:enabled="true"
         android:exported="true"
         android:priority="100" />

这是实施上述要求的正确方法吗?请建议。

3 个答案:

答案 0 :(得分:0)

没有什么可以保持服务全天候运行。 Android框架可能随时终止服务以获取资源。

此外,在更现代的Android版本中,您将进入Doze模式。 Doze是一种深度睡眠模式,可以节省电池电量。它将阻止您的服务每30秒运行一次以节省电池电量。

可能有一种方法可以绕过AlarmManager并使用setExactAndAllowWhileIdle。但是不建议任何Play商店应用,你会杀死用户的电池。

我真的怀疑为什么你需要如此频繁地获取数据。可能你没有,并且要么完全过度工程,要么完全做错了。

答案 1 :(得分:0)

我在这里找到了另一个解决方案,并没有100%回答我的问题。

Android-Job

Gradle:app

compile 'com.evernote:android-job:1.1.3'

代码:

new JobRequest.Builder(SocketSyncJob.TAG)
                .setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX)
                .setRequiresCharging(false)
                .setRequiresDeviceIdle(true)
                .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
                .setRequirementsEnforced(false)
                .setPersisted(true)
                .build()
                .schedule();

答案 2 :(得分:-1)

您的活动代码

AlarmManager am =(AlarmManager)getContext().getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(getContext(), ScanReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(getContext(), 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60, pi);    

//接收器

public class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         //start your service
    }

}

并显示添加此

<receiver android:name=".Receiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
</receiver>

它会在一分钟内拨打您的接收器,这是默认时间,无论您的应用是否开启。