Java 理解Android上下文:(空对象引用)

Java 理解Android上下文:(空对象引用),java,android,static,alarmmanager,android-context,Java,Android,Static,Alarmmanager,Android Context,我想构建一个简单的静态方法,从当前手机中获取下一个预定闹钟。实现了非静态,在Main_活动中一切正常,但现在在作为静态方法的单独类中,我在空对象引用上得到错误:“android.content.Context.getContentResolver()” 我想我对上下文的理解不够好。 我发现了这个:但是我认为这不是正确的方法,我想我只是错过了一些东西,有人能帮我吗 import android.os.Bundle; import android.provider.Settings; import

我想构建一个简单的静态方法,从当前手机中获取下一个预定闹钟。实现了非静态,在
Main_活动中
一切正常,但现在在作为静态方法的单独类中,我在空对象引用上得到错误:“android.content.Context.getContentResolver()”

我想我对上下文的理解不够好。 我发现了这个:但是我认为这不是正确的方法,我想我只是错过了一些东西,有人能帮我吗

import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;


public class Controller extends AppCompatActivity {

    private static Controller staticController = new Controller();

    /**
     * Finds out what the next user scheduled alarm is.
     *
     * @return (String) next time the user has scheduled an alarm on his device.
     */
    protected static String nextAlarm() {

        String nextAlarmTime = null;

        // deprecated method will also detect non native alarm clocks!
        nextAlarmTime = Settings.System.getString(staticController.getContentResolver(),
                Settings.System.NEXT_ALARM_FORMATTED);

        // fallback if deprecated method does not find valid alarm time!
//        if (nextAlarmTime == null) {
//            AlarmManager am = (AlarmManager) staticController.getSystemService(Context.ALARM_SERVICE);
//            AlarmManager.AlarmClockInfo alarmInfo = am.getNextAlarmClock();
//            Long alarm_next = alarmInfo.getTriggerTime();
//            nextAlarmTime = (new Date(alarm_next)).toString();
//        }

        return nextAlarmTime;
    }

    // Do I need onCreate here ?
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


}

(我不知道这是否重要,但该控制器类未作为活动包含在清单文件中。我刚刚创建了一个新类,并从AppCompatActivity进行了扩展)

这就是问题所在:
new Controller()。切勿自己实例化
活动
类(或从中派生的类)。只有系统应该这样做,从而初始化所有必需的字段。

上面评论中提到的Commonware在这种情况下似乎是正确的

为什么不将上下文(或ContentResolver)作为参数传递 到nextAlarm()

以下是我将其更改为:

import android.app.AlarmManager;
import android.content.Context;
import android.provider.Settings;
import java.util.Date;

public class Controller extends {  **//does not need to be a Activity any more**

    /**
     * Finds out what the next user scheduled alarm is.
     *
     * @return (String) next time the user has scheduled an alarm on his device.
     */
    protected static String nextAlarm(Context context) { //**pass Context from other Activity** 

        String nextAlarmTime = null;

        // deprecated method will also detect non native alarm clocks!
        nextAlarmTime = Settings.System.getString(context.getContentResolver(),  //**reference parameter here**
                Settings.System.NEXT_ALARM_FORMATTED);

        // fallback if deprecated method does not find valid alarm time!
        if (nextAlarmTime == null) {
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // **reference parameter again**
            AlarmManager.AlarmClockInfo alarmInfo = am.getNextAlarmClock();
            Long alarm_next = alarmInfo.getTriggerTime();
            nextAlarmTime = (new Date(alarm_next)).toString();
        }

        return nextAlarmTime;
    }

}

然后在某些活动中通过
Controller.nextAlarm(this))
简单地调用它。

什么是
Controller
?为什么不将
上下文
(或
ContentResolver
)作为参数传递给
nextAlarm()
?通过构造函数将上下文传递给simple类,并使用它实现以下目的: