目前,自设备启动以来,我设法通过移动网络接收/传输每 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版本上,您将进入打瞌睡模式。 打瞌睡是一种深度睡眠模式,可节省电池电量。 它将阻止您的服务每 30 秒运行一次以节省电池电量。
可能有一种方法可以绕过它 AlarmManager 并使用 setExactAndAllowWhileIdle。 但不建议任何 Play 商店应用程序使用,您将耗尽用户的电池。
真的,我会质疑为什么你需要如此频繁地获取数据。 很有可能你没有,要么过度设计,要么完全做错了事情。
我在这里找到了另一种解决方案,它不是 100% 回答我的问题。
安卓作业
格拉德尔: 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 调用您的接收器,这是默认时间,无论您的应用程序是否打开。