Android:位置;活动和服务

时间:2011-07-06 06:36:58

标签: java android geolocation

我正在开发一些应该获取当前位置的应用程序,并且在设备位于某个半径之后应该显示应用程序并显示一些消息。 我有几个问题。 我正在尝试使用

获取位置
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000*60*5, 50, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000*60*5, 50, locationListener);
addProximityAlert(LAT,LONG);

private void addProximityAlert(double latitude, double longitude) 
        {
            Intent intent = new Intent(this.getApplicationContext(), SOME_CLASS_HERE); 
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Does this needed even if apllication/activity is alive?
            PendingIntent proximityIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); //and does this needed again?
            locationManager.addProximityAlert(latitude, longitude, Radius, 0, proximityIntent);
        }
  1. 如果我使用requestLocationUpdates,则GPS始终有效。这是浪费电池。也许有一些方法,例如,暂停几分钟?我的意思是每5分钟使用一次GPS,例如从一个位置取出到下一个位置。怎么实现这个?

  2. 如果SOME_CLASS_HERE - 一些活动类,那么我怎么知道这个事件究竟是否被称为它?因为当ProximityAlert被触发时,我也需要调用一些活动的函数。我怎么能这样做?


  3. UPD:现在我只使用Activity(我根本没有服务) 我正在尝试下一步:

    Intent intent = new Intent(getString(R.string.intent_message_location_fetched));
    PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    locationManager.addProximityAlert(LAT, LONG, RADIUS, 0, proximityIntent);
    

    正如我理解行动的意图一样,R.string.intent_message_location_fetched应​​该在位置LAT LONG之后被解雇。

    然后我正在尝试创建BroadcastReciver类:

    public class MyBroadcastReciver extends BroadcastReceiver {
        MyActivity mainActivity;
        public MyBroadcastReciver(MyActivity activity)
        {
            mainActivity = activity;
        }
        @Override
        public void onReceive(Context context, Intent intent) {
            mainActivity.ShowToast("Recived : " + intent.getAction());
        }
    }
    

    在MyActivity类中注册reciver:

    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
            myReciver = new MyBroadcastReciver(this);
            IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(getString(R.string.intent_message_location_fetched));
            registerReceiver(myReciver, intentFilter);
    ...
    

    但是当我在LAT LONG位置时没有任何反应。怎么了? 也许我应该在AndroidManifest.xml中注册reciver?但到底是怎么回事?

3 个答案:

答案 0 :(得分:1)

1.您应该在此处查看答案,使用计时器通过GPS打开/关闭位置查找:android locationManager requestLocationUpdates

每隔X秒启动一次计时器。在处理计时器期间,将请求位置更新,并且在检索到位置之后,它将停止GPS监听器。

2.您应该在接近警报逻辑结束后发送意图。然后,您可以注册一个侦听该意图的广播接收器,并进行处理。 Intent机制提供了一种松散耦合的活动/服务之间的通信方式。

您可以找到an example如何广播意图(在您的情况下是从您的接近警报)广播接收者(应用程序中将接收意图的新组件,并相应地处理它)。它还显示了如何在清单中设置接收器以侦听您的自定义Intent。

答案 1 :(得分:1)

  

如果我使用requestLocationUpdates,则GPS始终有效。这是浪费电池。也许有一些方法,例如,暂停几分钟?我的意思是每5分钟使用一次GPS,例如从一个位置取出到下一个位置。怎么实现这个?

addProximityAlert()每4分钟使用一次GPS。如果您想每x分钟使用一次GPS,请运行服务并每隔x分钟获得single shot fixes,并手动检查该区域是否存在。

  

如果SOME_CLASS_HERE - 某些活动   上课,然后我怎么知道   究竟这个事件叫它吗?因为   当ProximityAlert被触发时我   需要调用一些活动的功能   同样。我怎么能这样做?

不完全确定你在这里问的是什么

以下是如何使用待定意图

    PendingIntent pendingIntent;
    Intent intent = new Intent();
    intent.setClass(mContext, yourActivity.class);
    pendingIntent =  PendingIntent.getActivity(mContext, 0, intent, 0);

FLAG_ACTIVITY_NEW_TASK: 这使启动的活动成为任务的根活动。如果您正在为正在启动的活动运行任务,则将无法启动新活动;相反,当前任务将简单地以最后一个状态显示在屏幕的前面。

答案 2 :(得分:0)

我正在使用此代码获取用户的当前位置。

 public class HomeActivity extends Activity implements LocationListener{
public static Context mContext;
private double latitude, longitude;
 public LocationManager mLocManager;
// *******This is the new Code start on 11/4/2011 at 3 o'clock


/**
 * This is the Home Button if user Login then it is move to TennisAppActivity otherwise move to Login  
 *
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    mContext=this;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.homelayout);


    mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            this);
    mLocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
            0, this);
    locationUpdate();
    ((Button) this.findViewById(R.id.ButtonHome))
            .setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {

                        startActivity(new Intent(HomeActivity.this,
                                DefaultDisplay.class));

                }
            });

    ((Button) this.findViewById(R.id.ButtonProfile))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                MyProfile.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","MyProfile");
                        startActivity(intent);
                    }
                }
            });

    ((Button) this.findViewById(R.id.ButtonNotifications))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                ShowAllNotificationActiviry.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","ShowAllNotificationActiviry");
                        startActivity(intent);
                    }
                }
            });

    ((Button) this.findViewById(R.id.ButtonFavorites))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                FavoritesActivity.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","FavoritesActivity");
                        startActivity(intent);
                    }
                }
            });

            ((Button) this.findViewById(R.id.ButtonMore))
            .setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                        startActivity(new Intent(HomeActivity.this,
                                MoreListActivity.class));
                }
            });

}

public void locationUpdate()
{
    CellLocation.requestLocationUpdate();
}


public void getAddress(double lat, double lng) {
    Geocoder geocoder = new Geocoder(HomeActivity.mContext, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
        Address obj = addresses.get(0);
        String add = obj.getAddressLine(0);
        GUIStatics.currentAddress = obj.getSubAdminArea() + ","
                + obj.getAdminArea();
        GUIStatics.latitude = obj.getLatitude();
        GUIStatics.longitude = obj.getLongitude();
        GUIStatics.currentCity= obj.getSubAdminArea();
        GUIStatics.currentState= obj.getAdminArea();
        add = add + "\n" + obj.getCountryName();
        add = add + "\n" + obj.getCountryCode();
        add = add + "\n" + obj.getAdminArea();
        add = add + "\n" + obj.getPostalCode();
        add = add + "\n" + obj.getSubAdminArea();
        add = add + "\n" + obj.getLocality();
        add = add + "\n" + obj.getSubThoroughfare();

        Log.v("IGA", "Address" + add);
        // Toast.makeText(this, "Address=>" + add,
        // Toast.LENGTH_SHORT).show();

        // TennisAppActivity.showDialog(add);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}



public void onLocationChanged(Location location) {
    latitude = location.getLatitude();
    longitude = location.getLongitude();
    GUIStatics.latitude=location.getLatitude();
    GUIStatics.longitude= location.getLongitude();
    Log.v("Test", "IGA" + "Lat" + latitude + "   Lng" + longitude);
    //mLocManager.r

    getAddress(latitude, longitude);
    if(location!=null)
    {

    mLocManager.removeUpdates(this);
    }
    // Toast.makeText(this, "Lat" + latitude + "   Lng" + longitude,
    // Toast.LENGTH_SHORT).show();
}


public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(HomeActivity.this, "Gps Disabled", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(
            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
}


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

}


public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
     if(arg1 == 
            LocationProvider.TEMPORARILY_UNAVAILABLE) { 
                                    Toast.makeText(HomeActivity.this, 
            "LocationProvider.TEMPORARILY_UNAVAILABLE", 
            Toast.LENGTH_SHORT).show(); 
                        } 
                        else if(arg1== LocationProvider.OUT_OF_SERVICE) { 
                                    Toast.makeText(HomeActivity.this, 
            "LocationProvider.OUT_OF_SERVICE", Toast.LENGTH_SHORT).show(); 
                        } 

}

}

在此代码中找到

mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,                 本);

在此方法中提供第一个参数,II- timeforupdate位置,III更新请求的思维,

 mLocManager.removeUpdates(this);

以上的通话方法取消了位置的更新,以便节省电池。 我希望这对你有所帮助。