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



今天,我制作了第一个后台服务,如果我退出应用程序,该服务将继续运行。

它是伐木和孤独。

我想

在我的代码中添加更多功能,我想请您帮助我应该以哪种方式进行编码,我已经做了吗?

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

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) {

    }
}

}

我想解决的一些问题:

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

另一件事:如果我多次快速启动和退出我的应用程序,每次我都会收到处理程序启动并且我会收到多条日志消息。我怎样才能制作这个或类似的东西的单例?

感谢您的帮助

将应用程序用于这些目的。

可以将单一实例逻辑实现到应用程序类中并管理服务。

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

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

**主Activity必须启动处理程序才能Service与活动通信

下面是一些代码:

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;        
}
 }

最新更新