Java 尝试实现getSystemService()时onCreate()之前的活动无法使用系统服务

Java 尝试实现getSystemService()时onCreate()之前的活动无法使用系统服务,java,android,Java,Android,因此,我试图实现一个AlertDialog,按下“激活”按钮时应该会打开,但按下按钮时,应用程序崩溃 这是我的密码 主要活动- public class MainActivity extends Activity { Button activateButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConte

因此,我试图实现一个AlertDialog,按下“激活”按钮时应该会打开,但按下按钮时,应用程序崩溃

这是我的密码

主要活动-

public class MainActivity extends Activity {

Button activateButton;


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

    activateButton = (Button)findViewById(R.id.activate);
    activateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Speed s = new Speed();
        }
    });

}
这是另一个名为Speed的类,它包含AlertDialog的代码

public class Speed extends Activity {
    LocationManager mManager;
    final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
    AlertDialog.Builder box = new AlertDialog.Builder(this);
    Speed(){
        Status();
    }

    private void Status(){

        if(!mManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            DialogBox();
        }
    }

    protected void DialogBox(){
        AlertDialog.Builder box = new AlertDialog.Builder(this);
        box.setTitle("The GPS needs to be enabled. Would you like to enable the GPS?").setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int id){
                        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int id){
                dialog.cancel();
            }
        });
        final AlertDialog alert = box.create();
        alert.show();

    }

}
此外,这是上下文中出现错误的日志

10-01 21:27:00.439: E/AndroidRuntime(5503): FATAL EXCEPTION: main
10-01 21:27:00.439: E/AndroidRuntime(5503): java.lang.IllegalStateException: System services not available to Activities before onCreate()
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.app.Activity.getSystemService(Activity.java:3989)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at com.scimet.admin.driveon.Speed.<init>(Speed.java:12)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at com.scimet.admin.driveon.MainActivity$1.onClick(MainActivity.java:25)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.view.View.performClick(View.java:3534)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.view.View$PerformClick.run(View.java:14263)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.os.Handler.handleCallback(Handler.java:605)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.os.Looper.loop(Looper.java:137)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at android.app.ActivityThread.main(ActivityThread.java:4441)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at java.lang.reflect.Method.invokeNative(Native Method)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at java.lang.reflect.Method.invoke(Method.java:511)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-01 21:27:00.439: E/AndroidRuntime(5503):     at dalvik.system.NativeStart.main(Native Method)
10-01 21:27:00.439:E/AndroidRuntime(5503):致命异常:主
10-01 21:27:00.439:E/AndroidRuntime(5503):java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.app.Activity.getSystemService(Activity.java:3989)上
10-01 21:27:00.439:E/AndroidRuntime(5503):位于com.scimet.admin.driveon.Speed.(Speed.java:12)
10-01 21:27:00.439:E/AndroidRuntime(5503):位于com.scimet.admin.driveon.MainActivity$1.onClick(MainActivity.java:25)
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.view.view.performClick(view.java:3534)
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.view.view$PerformClick.run(view.java:14263)
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.os.Handler.handleCallback(Handler.java:605)上
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.os.Handler.dispatchMessage(Handler.java:92)上
10-01 21:27:00.439:E/AndroidRuntime(5503):在android.os.Looper.loop(Looper.java:137)
10-01 21:27:00.439:E/AndroidRuntime(5503):位于android.app.ActivityThread.main(ActivityThread.java:4441)
10-01 21:27:00.439:E/AndroidRuntime(5503):位于java.lang.reflect.Method.Invokenactive(本机方法)
10-01 21:27:00.439:E/AndroidRuntime(5503):在java.lang.reflect.Method.invoke(Method.java:511)
10-01 21:27:00.439:E/AndroidRuntime(5503):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-01 21:27:00.439:E/AndroidRuntime(5503):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-01 21:27:00.439:E/AndroidRuntime(5503):在dalvik.system.NativeStart.main(本机方法)
这是我的第一个Android项目。我花了好几个小时试图解决这个问题,结果却没有找到解决办法。请指出错误


谢谢大家!

您应该将此代码放在onCreate方法中,因为它将在创建活动时运行

比如说

在类中删除构造函数

然后在活动的onCreate方法上执行以下操作:

public class MainActivity extends Activity {
  LocationManager manager; 
  AlertDialog.Builder box;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    box = new AlertDialog.Builder(this);
    manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
    Status();
  }
}

活动应用于表示不同的用户流,不应使用“new”进行实例化

如果将MainActivity中的速度实例化行替换为:

Speed s = new Speed(MainActivity.this);
而是将速度视为标准类,并将MainActivity中的传递视为上下文对象

public class Speed{
    LocationManager mManager;
    final LocationManager manager;
    AlertDialog.Builder box;

    final Context context;


    Speed(Context context){
        this.context = context;
        mManager = context.getSystemService(Context.LOCATION_SERVICE );
        Status();
    }

    private void Status(){

        if(!mManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            DialogBox();
        }
    }
    protected void DialogBox(){
        AlertDialog.Builder box = new AlertDialog.Builder(this.context);
        box.setTitle("The GPS needs to be enabled. Would you like to enable the GPS?").setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int id){
                        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int id){
                dialog.cancel();
            }
        });
        final AlertDialog alert = box.create();
        alert.show();
    }
}

如果您希望保持速度处理内容与活动本身之间的分离,则只需执行此操作。

您需要在OnCreateOK中执行所有这些操作。但是为什么呢?对不起,我不知道如何构造代码。此外,我还将在Speed类中添加一些GPS功能。因为这是它可用的时候。速度看起来不应该是一项活动。它是否应该是可以将MainActivity传递到的标准类?活动不应使用“new”进行实例化,而是通过intent系统启动。谢谢,但您能更具体一点吗?什么时候可用?我是不是让我的设计复杂化了?你先忘记了
super
呼叫。如果没有它,您将获得与OP相同的结果。