其他分享
首页 > 其他分享> > android-更新服务在后台运行

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