簡體   English   中英

如何創建后台應用程序(服務)以每30秒獲取一次移動數據。 該服務必須在24/7中運行

[英]How to create a background app (Service) to get the mobile data every 30 sec. The service must working in 24/7

目前,自設備啟動以來,我設法每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" />

這是實現上述要求的正確方法嗎? 請提出建議。

沒有什么可以使服務保持24/7全天候運行。 Android框架可能會隨時終止服務的資源。

此外,在更現代的Android版本上,您將進入打ze模式。 打ze是一種深度睡眠模式,可以節省電池電量。 這將阻止您的服務每30秒運行一次以節省電池電量。

可能有辦法解決AlarmManager並使用setExactAndAllowWhileIdle。 但這並不建議用於任何Play Store應用,因為這會耗盡用戶的電量。

真的,我會質疑為什么您需要如此頻繁地獲取數據。 奇怪的是您沒有,或者是過度設計,或者完全做錯了事。

我在這里找到了另一個解決方案,它不是100%回答了我的問題。

Android作業

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();

您的活動代碼

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>

它將在默認時間一分鍾24/7分鍾內呼叫您的接收器,無論您的應用程序是否打開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM