0

今日、アプリケーションを終了しても実行し続ける最初のバックグラウンド サービスを作成しました。

緯度と経度を記録しています。

コードにさらに関数を追加したいのですが、どの方法でコーディングを続ければよいか教えていただきたいのですが、すでに作成してよろしいですか?

バックグラウンド サービスからメッセージを取得するハンドラーを使用して、アクティビティを操作します。

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


    }
}

}

私が解決したいいくつかの問題:

ハンドラー、サービス、またはコード内の何かを制御して、サービスの停止、開始などを確実に維持することは可能ですか? たとえば、サービスのオンとオフを切り替えるウィジェットボタンからコントロールを追加したいと思います。どのように可能ですか?

もう 1 つ: アプリケーションを何度もすばやく起動して終了すると、ハンドラが初期化されるたびに複数のログ メッセージが表示されます。これまたはそのようなもののシングルトンを作成するにはどうすればよいですか?

助けてくれてありがとう

4

1 に答える 1

1

それらの目的のためにアプリケーションを使用してください。

Application クラスにシングルトン ロジックを実装し、サービスを管理できます。

アクティビティを閉じると、サービスはアプリケーションにアクティビティが有効かどうかを尋ねます。

InterfacesLaunch Activity では、Application はそのことを認識しており、Service は、Application保存されている一部のアクティビティを使用して、上記の Activity とバインドできます。

** mainは、Activity と対話するためにHandlerActivityを開始する必要があります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;        
}

 }
于 2013-01-21T15:13:18.757 に答える