我的工作是将中继关于它的位置到远程服务器信息的应用程序。 我打算做一个简单的HTTP发布到Web服务器做到这一点,一切都简单而精致。
但根据该规范,应用程序需要从时间执行自己的时间,可在每30分钟一次说。 是独立的接口,意义它需要即使应用程序被关闭运行的。
我环顾四周,发现了Android服务是需要使用什么。 我可以用它来实现这样的系统。 将服务(或其他机构),重启手机重启时?
提前致谢。
我的工作是将中继关于它的位置到远程服务器信息的应用程序。 我打算做一个简单的HTTP发布到Web服务器做到这一点,一切都简单而精致。
但根据该规范,应用程序需要从时间执行自己的时间,可在每30分钟一次说。 是独立的接口,意义它需要即使应用程序被关闭运行的。
我环顾四周,发现了Android服务是需要使用什么。 我可以用它来实现这样的系统。 将服务(或其他机构),重启手机重启时?
提前致谢。
创建Service
您的信息发送到您的服务器。 想必,你就是我的控制之下。
你的Service
应该由触发警报启动AlarmManager
,在那里你可以指定一个时间间隔。 除非你有报告数据准确 ,每隔30分钟,你可能想不准确的报警,所以你可以节省一些电池寿命。
最后,您可以注册您的应用程序通过设置来获得在启动广播BroadcastReceiver
,像这样:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
// Register your reporting alarms here.
}
}
}
你需要以下权限添加到您AndroidManifest.xml
该工作。 不要忘记,当您正常运行该应用注册你的报警,否则他们会仅登记在设备启动。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
这里是一个半不同的方式来保持业务持续永远。 有方法来杀死它的代码,如果你想
后台服务:
package com.ex.ample;
import android.app.Service;
import android.content.*;
import android.os.*;
import android.widget.Toast;
public class BackgroundService extends Service {
public Context context = this;
public Handler handler = null;
public static Runnable runnable = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();
handler = new Handler();
runnable = new Runnable() {
public void run() {
Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show();
handler.postDelayed(runnable, 10000);
}
};
handler.postDelayed(runnable, 15000);
}
@Override
public void onDestroy() {
/* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */
//handler.removeCallbacks(runnable);
Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show();
}
}
这里是你如何从你的主要活动启动它或者你想去的地方:
startService(new Intent(this, BackgroundService.class));
onDestroy()
当应用程序被关闭或被杀,但可运行的只是启动它右后卫将被调用。
我希望这可以帮助别人了。
之所以有些人这样做是因为企业应用中,在某些情况下,用户/雇员必须不能阻止某些事情的:)
http://i.imgur.com/1vCnYJW.png
由于Android的O(8.0),你必须使用JobManager
计划任务。 有一个叫库Android系统的工作由Evernote的 ,这将使定期进行后台工作微风所有的Android版本。 我也做了Xamarin绑定这个库。
然后,所有你需要做的是以下几点:
在您的应用程序类:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
JobManager.create(this).addJobCreator(new MyJobCreator());
}
}
创建以下两类YourJobCreator
和YourSyncJob
(这里所有的工作都将完成。Android的分配时间来运行所有的后台作业。针对Android版本<8.0,将仍使用报警管理器和后台服务按正常运行)
public class MyJobCreator implements JobCreator {
@Override
@Nullable
public Job create(@NonNull String tag) {
switch (tag) {
case MySyncJob.TAG:
return new MySyncJob();
default:
return null;
}
}
}
public class MySyncJob extends Job {
public static final String TAG = "my_job_tag";
@Override
@NonNull
protected Result onRunJob(Params params) {
//
// run your job here
//
//
return Result.SUCCESS;
}
public static void scheduleJob() {
new JobRequest.Builder(MySyncJob.TAG)
.setExecutionWindow(30_000L, 40_000L) //Every 30 seconds for 40 seconds
.build()
.schedule();
}
}
你应该报警管理器来安排你的服务,首先创建服务的挂起的意图:
Intent ii = new Intent(getApplicationContext(), MyService.class);
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii,
PendingIntent.FLAG_CANCEL_CURRENT);
然后,使用报警管理器来安排吧:
//getting current time and add 5 seconds to it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);
这个当前时间5秒后将会启动服务。 你可以让你的报警重复。
您可以使用报警管理器在指定的时间来启动服务,然后在指定的时间间隔重复报警。 当有报警的推移,你可以开始服务,并连接到服务器,让你想要什么