android-更新服务在后台运行
作者:互联网
我需要执行这样的过程:
>启动后台服务
>使用参数更新服务(从UI-用户输入)
>活动结束后,服务应继续运行,并每分钟对HTTP服务器执行请求.在此阶段中,我仍然需要在第二阶段中更新的参数-我将它们发送到服务器.
>服务应存储服务器的最后响应,并使用最后响应进行响应.如果有更改,请通知用户.
>最后,当活动再次开始时,服务应使用最新的服务器响应来更新UI.
我试过的
BroadcastReciver-问题在于onRecive结束后,所有未声明为final的参数都会消失,而且我也没有找到一种方法来更新每分钟自动发送的Intent.
服务-使用startService()-问题是当活动结束服务(如停止和启动)时,将刷新其所有参数.再一次,我没有弄清楚在服务启动后如何更新参数.
那么如何处理这种情况呢?
谢谢.
解决方法:
听起来您需要做的就是能够“绑定”到您的服务.我在下面发布的是一个简单的模板.出于您的目的,您将需要在Service类中存储变量并创建getter,以便在您重新启动活动时可以获取最新的变量.另外-请注意,我在onResume和onPause中启动和停止了以下服务示例.毫无疑问,您将希望以不同的方式进行操作.
//Activity
//Bind to Service Example
public class ExampleActivity extends Activity implements OnClickListener {
// UI
private Button binderButton;
// service
private MyService myService;
private Intent serviceIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
// binder button
binderButton = (Button) findViewById(R.id.button1);
binderButton.setOnClickListener(this);
binderButton.setText("start");
serviceIntent = new Intent(this, MyService.class);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = ((MyService.MyBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
};
@Override
protected void onResume() {
super.onResume();
// start the service
startService(serviceIntent);
// bind to the service
bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
// call method within the service
myService.doServiceStuff();
break;
}
}
@Override
protected void onPause() {
super.onPause();
stopService(serviceIntent);
unbindService(serviceConnection);
}
}
//Service
public class MyService extends Service {
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent arg0) {
return binder;
}
public void doServiceStuff() {
task.execute();
}
// create an inner Binder class
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Log.d("yourTag", "long running service task");
return null;
}
};
}
标签:android-broadcast,android-intent,android-service,android 来源: https://codeday.me/bug/20191030/1969790.html