getSystemService由服务中的新TimerTask启动

时间:2013-05-09 14:01:03

标签: java android

Hello Community,

我是编程的初学者。我尝试了一些代码片段并且它们工作正常。现在我想让他们在一起,但我有一些问题。

我有什么:

  • Android Galaxy S Handy
  • Indigo Service Release 2

我想做什么:
每2分钟,Handy将获取该位置并通过http将信息发送到mysql数据库。 正如我上面所说,每一步都可以正常工作,但将它们放在一起对我来说是一个问题。

我做了什么: 我创建了一个启动屏幕,其中有两个按钮来启动和停止服务。因此,当我关闭应用程序时,启动的服务将继续发送数据:

package ars.samsung.de;

import ars.samsung.de.MyService;
import ars.samsung.de.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SamsungLoc1 extends Activity implements OnClickListener {
    private static final String TAG = "ServicesDemo";
      Button buttonStart, buttonStop;

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

        buttonStart = (Button) findViewById(R.id.buttonStart);
        buttonStop = (Button) findViewById(R.id.buttonStop);

        buttonStart.setOnClickListener(this);
        buttonStop.setOnClickListener(this);

    }


    public void onClick(View src) {
        switch (src.getId()) {
        case R.id.buttonStart:
          Log.d(TAG, "onClick: starting service");
          startService(new Intent(this, MyService.class));
          break;
        case R.id.buttonStop:
          Log.d(TAG, "onClick: stopping service");
          stopService(new Intent(this, MyService.class));
          break;
        }
      } 
}

因此,当单击开始按钮时,服务MyService.class启动:

package ars.samsung.de;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import ars.samsung.de.*;

public class MyService extends Service {
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
          Timer t = new Timer();
            t.scheduleAtFixedRate(new TimerTask() {
//              @Override
                public void run() {
                    String url = "";
                    String Output ="";
                    //Called each time when xxx milliseconds (1 second) (the period parameter)
                    // Locator Start
                    MyNetworkLocator mnl1 = new MyNetworkLocator();
                    mnl1.starter(this);
//                  mnl1.starter(context);
                    // Locator Ende

                    MyHilfsklasse mhk1 = new MyHilfsklasse();
                    try {
                        //Output = mhk1.my_getUrlContent_v2();
                        url="http://www.mysite.net/test/location/location_push.php?VONHANDY=c&MYLATITUDE=1.6&MYLONGITUDE=3.2";
                        Output = mhk1.my_getUrlContent_v3(url);
                        Log.d(TAG, "Http done");
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        Log.d(TAG, "Catch: Http");
                    }       
                }                    
            },
            //Set how long before to start calling the TimerTask (in milliseconds)
            0,
            //Set the amount of time between each execution (in milliseconds)
            120000);        
    }
}

因此上面的服务将通过新的TimerTask每2分钟执行一次任务。第一步工作正常,每两分钟发送一个虚拟PHP。

但我想现在获取位置信息。在上面的代码中,我在mnl1.starter(this)收到错误。 错误是"The method starter(Context) in the type MyNetworkLocator is not applicable for the arguments (newTimerTask(){})

MyNetworkLocator看起来像这样:

package ars.samsung.de;

import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class MyNetworkLocator implements LocationListener{

    private LocationManager mgr;
    private String best;
    Location location;
    public static double myLocationLatitude;
    public static double myLocationLongitude;



    public void starter(Context context) {
 //        mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        best = mgr.getBestProvider(criteria, true);
//        location = mgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        location = mgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        dumpLocation(location);

    }
    public void onLocationChanged(Location location) {
        dumpLocation(location);
    }

    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    protected void onPause() {

//        super.onPause();
        mgr.removeUpdates(this);
    }

    protected void onResume() {

//        super.onResume();
        mgr.requestLocationUpdates(best, 15000, 10, this);
    }

    private void dumpLocation(Location l) {

        if (l != null){

            myLocationLatitude = l.getLatitude();
            myLocationLongitude = l.getLongitude();
        }
    }   
}

我了解到getSystemService(LOCATION_SERVICE)需要一个上下文。所以我编写了context.getSystemService(Context.LOCATION_SERVICE)并将其设置为方法启动器中的参数。

通过

调用此方法
mnl1.starter(this);

不起作用,因为“this”不是上下文。

所以我试过

mnl1.starter(context);

我想在run(Context context)中再次将它作为参数。

但这不起作用,因为新的TimerTask必须在没有参数的情况下启动run()。


好吧,我希望你能理解我的问题。我尝试将活动的上下文提供给 getSystemService,但TimerTask总是在没有参数的情况下启动run()。

有没有人可以帮助我?一个代码剪断谁告诉我如何解决问题将是美好的。

来自德国的亲切问候,

0 个答案:

没有答案