Android活动流程 - 再次从Base Superclass到Subclass再到Baseclass

时间:2014-03-13 18:11:13

标签: java android android-activity subclass superclass

作为一个N00bie到Android,我正在尝试构建一个简单的地图应用程序。我开始在同一个班级做所有事情,但由于显而易见的原因而失控,快速。所以我想拆分类,基类作为活动的主流,子类作为'实用程序'类。

所以我实例化一个Subclass对象,并在子类的onCreate中开始调用方法。这些方法从未运行过。我究竟做错了什么?一旦我创建了子类对象,子onCreate应该触发,不是吗?而且,它甚至是在子类中执行此操作的聪明方式,而不是整个其他类?

提前致谢!

基类:

package com.example.TestMap;

import android.app.Activity;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;

public class MyActivity extends Activity  {

    private GoogleMap mMap;

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

        LocationClass locationClass = new LocationClass();



    }

    public void setMap(){
        Log.i("TestMap", "setMap");
        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        mMap.setMyLocationEnabled(true);

    }



    public void setCamera(Location location) {

        Log.i("TestMap", "setCamera");

        final LatLng locationLatLng = new LatLng( (location.getLatitude() ), location.getLongitude() );


        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(locationLatLng)      // Sets the center of the map to Mountain View
                .zoom(17)                   // Sets the zoom
                .bearing(90)                // Sets the orientation of the camera to east
                .tilt(30)                   // Sets the tilt of the camera to 30 degrees
                .build();                   // Creates a CameraPosition from the builder

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }

}

子类

package com.example.TestMap;

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.util.Log;
import android.widget.Toast;

import java.util.List;


public class LocationClass extends MyActivity implements LocationListener {

    private LocationManager locationManager;
    private String provider;
    private List<String> providers;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("TestMap", "LocationClass OnCreate");
        GetProivder();
    }


    public void GetProivder (){
        Log.i("TestMap", "LocationClass GetProivder");


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

        Criteria criteria = new Criteria();
        criteria.setAccuracy(2);
        provider = locationManager.getBestProvider(criteria, false);
        providers = locationManager.getProviders(true);

        Location location = locationManager.getLastKnownLocation(provider);

        Log.i("TestMap", "providerlist = " + providers);
        Log.i("TestMap", "getBestProvider = " + provider);
        Log.i("TestMap", "Location = " + location);

        if (location != null) {
            Log.i("TestMap", "Provider " + provider + " has been selected.");
            super.setCamera(location);
            super.setMap();

        } else {
            Log.i("TestMap", "location is null.");

        }
    }


    @Override
    public void onLocationChanged(Location location) {
        Log.i("TestMap", "onLocationChanged");
    }

    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.i("TestMap", "onStatusChanged");
    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(this, "Enabled new provider " + provider,
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderDisabled(String provider) {
        Log.i("TestMap", "onProviderDisabled");
        Toast.makeText(this, "Disabled provider " + provider,
                Toast.LENGTH_SHORT).show();
    }


}

2 个答案:

答案 0 :(得分:2)

您的代码

LocationClass locationClass = new LocationClass();无法创建它。它只是它的一个对象,但它并没有与生命周期联系并调用方法。

您需要启动它以使其显示(并根据略读代码获取整个屏幕)。当你这样做时,Android会触发相应的方法调用。

像这样:

Intent intent = new Intent(this, LocationClass.class);          
startActivity(intent);

可在此处找到更多信息:http://developer.android.com/training/basics/firstapp/starting-activity.html#StartActivity

它必须在你的清单中定义,否则会崩溃。您的代码中还有其他明显的奇怪之处,您希望LocationClass扩展MyActivity而不是Activity吗?你的LocationClass也没有在onCreate中调用setContentView(),所以你不会看到一个UI(据我所知),除非你想通过extends部分。

编辑: 如果你扩展子类并把这个意图代码放在onCreate中,你可能会崩溃,因为它会在MyActivity中调用super()(再次调用onCreate(),因为它是超类),并且会继续做更多的意图来启动活动。如果那是“父”类,那么你不应该继承MyActivity的子类。

您应该只对子活动或全局父活动进行子类化(例如,在我的项目中,我扩展了SpiceActivity,因为它们都使用与Spice相关的常见组件。)

答案 1 :(得分:0)

子类'onCreate方法应该在Android创建时调用(参见Understanding the Lifecycle Callbacks),例如在发布对该Activity的Intent时就会发生。

编辑:我刚看到@Mgamerz回答并意识到你的超类Activity中的那一行是你试图让Android创建子类Activity的地方。下一段现在有些不相关,但请注意,您仍然需要将子类活动添加到清单文件中。

你确定你的应用程序实际上是在启动子类Activity,还是它仍在启动超类Activity?您可能需要查看项目的“AndroidManifest.xml”文件,并检查是否存在与子类Activity相对应的<activity />元素。


如果超类具有可以/将被多个子类活动重用的功能,我认为将类拆分为超类和子类是明智的。例如,您可能有DirectionsActivitySearchActivity等子类活动,这些活动具有由其超类MapActivity提供的一些常见的地图相关活动。即使您现在只有一个子类Acitivty ,如果您认为以后可能会编写其他与地图相关的活动,那么拥有超类和子类仍然有意义。我认为将类分成超类和子类是不明智的,因为单个类太长了。如果你只想要一个帮助器类,并且你不希望将来有更多的MapActivity子类,你可以在与Activity类相同的包中创建一个MapUtils类,这将定义一些static辅助方法。例如,您可以将GetProvider方法放入这样的帮助程序类中。 Sketch示例(请注意MapHelper package-private 访问权限):

class MapHelper {

    static Location getProvider() {
        // ...
        return location;
    }

    // Other helper methods here
}

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...
        setCamera(MapHelper.getProvider());
        setMap();
    }

    // Other activity methods here
}