关于我的定位后台服务的问题

时间:2013-01-21 15:07:49

标签: android android-service

今天我做了第一个后台服务,如果我从我的应用程序退出,它将继续运行。

正在记录态度和经度。

我想在我的代码中添加更多功能,我想问一下你应该采用哪种方式来编码,并且我已经做好了吗?

我使用活动,使用处理程序从后台服务获取消息:

public class MyActivity extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_act);



    BackgroundLocationService.context=this;

    Intent i = new Intent(this, BackgroundLocationService.class);
    i.putExtra("handler", new Messenger(this.handler));
    startService(i);
            /*.......more code here......*/
}

    Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // get data from msg
        String result = msg.getData().getString("result");
        Log.i("Activiti map: Locationing Service handler: ", 
                          "get data: " + result);
        super.handleMessage(msg);
    }
};

这是我的后台服务:

public class BackgroundLocationService extends IntentService {

private static final String TAG = "Activiti map: Locationing Service";

private LocationManager locManager;
private LocationListener locListener = new MyLocationListener();
public static Context context;

private boolean gps_enabled = false;
private boolean network_enabled = false;

private boolean DEBUG=false;

private String latitude="0";
private String londitude="0";

Messenger messenger;
Timer t=new Timer();

public BackgroundLocationService()
{
    super("myintentservice");

    locManager = (LocationManager) context.getSystemService
                                   (Context.LOCATION_SERVICE);
    try {
        gps_enabled = 
                    locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
        if(DEBUG)
        Log.e(TAG, ex.toString());
    }
    try {
        network_enabled = 
                locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
        if(DEBUG)
        Log.e(TAG, ex.toString());
    }

    if (gps_enabled) {
        if(DEBUG)
        Log.i(TAG, "Gps is Enabled!");
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                     0, 0, locListener);
    } else {
        if(DEBUG)
        Log.i(TAG, "Gps is Disabled!");
    }
    if (network_enabled) {
        if(DEBUG)
        Log.i(TAG, "Network provider is enabled!");

                   locManager.requestLocationUpdates
                        (LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
    } else {
        if(DEBUG)
        Log.i(TAG, "Network provider is Disabled!");
    }
}



@Override
protected void onHandleIntent(Intent intent) {
    messenger=(Messenger) intent.getExtras().get("handler");

    t.schedule(new TimerTask() {

        @Override
        public void run() {
            // just call the handler every 3 Seconds

            Message msg=Message.obtain();
            Bundle data=new Bundle();
            data.putString("result", "latitude: " + latitude+
                           " londitude: "+londitude);
            msg.setData(data);

            try {
                messenger.send(msg);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }, 100,3000);

}


class MyLocationListener implements LocationListener {

    private static final String TAG = "Activiti map: LocationListener";

    public void onLocationChanged(Location location) {

        if (location != null) {
            locManager.removeUpdates(locListener);

            londitude = Double.toString(location.getLongitude());
            latitude = Double.toString(location.getLatitude());

            if(DEBUG)
            Log.i(TAG, "Londitude: " + londitude + " Latitude: " + latitude);

        }
    }

    public void onProviderDisabled(String arg) {
        if(DEBUG)
        Log.i(TAG, "Provider just Disabled: " + arg);
    }

    public void onProviderEnabled(String arg) {
        if(DEBUG)
        Log.i(TAG, "Provider just Enabled: " + arg);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {


    }
}

}

我想解决的一些问题:

是否可以控制处理程序服务或代码中的任何内容以保持SURE,服务停止,启动等?所以我想添加控件,例如从小部件按钮开启和关闭服务。怎么可能?

另一件事:如果我快速启动并退出我的应用程序很多次我每次都有一个处理程序初始化,我得到了多个日志消息。我如何制作这样的单身或类似的单身?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

出于这些目的使用Application

您可以在Application类中实现单例逻辑并管理您的服务。

如果您关闭活动,服务会询问应用程序是否活动。

在启动活动上,应用程序知道并且服务可以使用InterfacesApplication存储的Activity与上述活动绑定。

** 主要Service必须启动Handler才能使public class MyApplication extends Application{ private static MyApplication mSingleton; private static final String PACKAGE = "com.code"; private static final String PROCESS_NAME = PACKAGE + ".ui"; private static final String SERVICE_NAME = PROCESS_NAME + "/" + PACKAGE + ".srvce.MyService"; @Override public void onCreate() { super.onCreate(); mSingleton = this; } public MyApplication getApp(){ return mSingleton; } .... public boolean isServiceRun() { ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); boolean isRunnig = false; for (int i = 0; i < services.size(); i++) { RunningServiceInfo inf = services.get(i); if(PROCESS_NAME.equals(inf.process)){ ComponentName cn = inf.service; String str = cn.toString(); if(str.contains(SERVICE_NAME)){ isRunnig = true; return isRunnig; } } } return isRunnig; } } 与活动进行对话

以下是一些代码:

{{1}}