在后台运行升级服务 [英] Update service running on background

查看:159
本文介绍了在后台运行升级服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to implement such a procedure:

  1. 在启动一个后台服务
  2. 更新与参数的服务(从用户界面 - 用户输入)
  3. 在活动结束后,该服务应继续运行和preform请求HTTP服务器的每一分钟。在这个阶段,我还需要我在第二阶段更新的参数 - 我把它们发送到服务器
  4. 应该存储在服务器上一个响应,到最后主持人每个服务。如果有变化,通知用户。
  5. 最后,当活动再次启动,该服务应更新的用户界面与最新的服务器响应。

我的尝试: BroadcastReciver - 问题是onRecive结束所有未声明为final的争论会消灭后,还有我没有找到一种方法来更新意图被自动发送的每一分钟

What I tried: BroadcastReciver - The problem is after onRecive ended all the arguments which aren't declared as final will wipe out, as well as I didn't found a way to update the Intent being sent automatically every minute.

服务 - 使用startService() - 问题是,当活动结束像停止和启动服务,冲洗一切的论点。并再次我也没有想出如何更新的参数已启动该服务后。

Service - Using startService() - The problem is when the activity ended the service like stops and starts , flushing all it's arguments. and once again I didn't figured out how to update the arguments after the service is already started.

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

So how to handle such a situation?

感谢。

推荐答案

感谢javaJoe,虽然你的答案并没有解决我的问题,这给了我一些的好想法。

Thanks javaJoe, although your answer didn't solved my problem it gave me some a good ideas.

我所做的:

  1. 在活动的onCreate,检查我的服务正在运行,如果是绑定别人,创造新的,并绑定。

  1. in the Activity onCreate, check if my service is running, if so bind it else, create new one and bind it.

传输服务,并使用getter和setter方法​​的活动之间的争论。

Transferring arguments between the Service and the Activity using setters and getters.

在活动的onDestroy(问题是,服务调用自Destory)的活动,通过意向将最终参数传递给Broadcastreciver。该Broadcastreciver不是再次启动该服务,使用正确的参数启动它。

in the Activity onDestroy (the problem was that the service calls self Destory) the Activity sends the final arguments through Intent to a Broadcastreciver. The Broadcastreciver than starts the Service again, initiating it with the correct arguments.

我不知道,如果这种体系结构是理想的,我希望能得到一些反馈。

I don't know if this architecture is ideal, i'd like to get some feedback.

下面是code:

活动:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Set Service Intent
    serviceIntent = new Intent(this, UpdateService.class);
    if (isMyServiceRunning()) {
        //Bind to the service
        bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }else{
        updateService=new UpdateService();
        //Start the service
        startService(serviceIntent);
        //Bind to the service
        bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }
}

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (UpdateService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        updateService = ((UpdateService.MyBinder) service).getService();
        //Set Initial Args
        updateService.setParams(int arg0);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        updateService = null;
    }
};

@Override
protected void onDestroy() {
    //UnBind from service
    unbindService(serviceConnection);
    //Stop Service
    stopService(serviceIntent);
    //Prepare intent to broadcast reciver
    Intent intent = new Intent(MainActivity.this,ServiceRunnerBCR.class);
    intent.setAction(ServiceRunnerBCR.ACTION_SET_UpdateService);
    intent.putExtra(ServiceRunnerBCR.keyVal_arg0, arg0);
    intent.putExtra(ServiceRunnerBCR.keyVal_arg1, arg1);
    //Send broadcast to start UpdateService after the activity ended
    sendBroadcast(intent);

    super.onStop();
}

Broadcastreciver:

Broadcastreciver:

public class ServiceRunnerBCR extends BroadcastReceiver {


public static final String ACTION_SET_UpdateService = "ACTION_ALARM";

public static final String keyVal_arg0="ARG0";
public static final String keyVal_arg1="ARG1";


@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_SET_UpdateService)){   
         updateIntent(context, intent.getDoubleExtra(keyVal_arg0, 0.02), intent.getStringExtra(keyVal_arg1));
    }
}

private void updateIntent(Context context, double arg0, String arg1){
    Intent intent = new Intent(context,UpdateService.class);
    intent.setAction(ACTION_SET_UpdateService);
    intent.putExtra(keyVal_arg0, arg0);
    intent.putExtra(keyVal_arg1, arg1);
    synchronized (this){
        try {
            this.wait(6000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    context.startService(intent);
    Log.d("OREN","ServiceRunner");
}

}

服务:

公共类UpdateService延伸服务{

public class UpdateService extends Service {

private final IBinder binder = new MyBinder();
public static final String keyVal_arg0="ARG0";
    public static final String keyVal_arg1="ARG1";
private Timer timer;
private HTTPHandler http = new HTTPHandler();
private int test=0;
double arg0=0;
String arg1= "";

private TimerTask updateTask = new TimerTask() {
    @Override
    public void run() {
        test++;
        Log.d("OREN", "Timer task doing work " + test + " arg0: " + arg0);
                    //Do some work here
    }
};


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent!=null){
        arg0=intent.getDoubleExtra(keyVal_arg0, 0.002);
                    arg1=intent.getStringExtra(keyVal_arg1);
        timer = new Timer("UpdateTimer");
        timer.schedule(updateTask, 1000L, 10 * 1000L);
        Log.d("OREN", "ServiceStarted" + test);
    }
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent intent) {
    Log.d("OREN", "OnBind" + test);
    return binder;
}

public void setArg0(double d){
    arg0=d;
}

// create an inner Binder class
public class MyBinder extends Binder {
    public UpdateService getService() {
        return UpdateService.this;
    }
}

@Override
public void onDestroy() {
    Log.d("OREN", "OnDestroy" + test);
    super.onDestroy();
}

@Override
public boolean onUnbind(Intent intent) {
    Log.d("OREN", "OnUnBind" + test);
    return super.onUnbind(intent);
}

}

这篇关于在后台运行升级服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆