gpt4 book ai didi

android - 后台运行更新服务

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:23 25 4
gpt4 key购买 nike

我需要实现这样一个过程:

  1. 启动后台服务
  2. 使用参数更新服务(从 UI - 用户输入)
  3. Activity 结束后,服务应继续运行并每分钟向 HTTP 服务器执行一次请求。在这个阶段我仍然需要我在第二阶段更新的参数 - 我将它们发送到服务器。
  4. 该服务应存储服务器最后的响应并将每个响应与最后一个进行比较。如果有变化,通知用户。
  5. 最后,当 Activity 再次启动时,服务应使用最新的服务器响应更新 UI。

我尝试过的:BroadcastReciver - 问题是在 onRecive 结束后,所有未声明为 final 的参数都将消失,而且我没有找到一种方法来更新每分钟自动发送的 Intent。

服务 - 使用 startService() - 问题是当 Activity 像停止和启动一样结束服务时,刷新它的所有参数。我又一次不知道如何在服务启动后更新参数。

那么如何处理这种情况呢?

谢谢。

最佳答案

听起来您需要做的就是能够“绑定(bind)”到您的服务。我在下面发布的是如何执行此操作的简单模板。为了您的目的,您需要将变量存储在您的服务类中并创建 getter,以便在您重新启动 Activity 时可以获得最新的变量。另外 - 请注意,我在 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 - 后台运行更新服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com