如何在静态方法中使用上下文来启动活动?

时间:2014-02-01 22:29:34

标签: android static android-context

我有一个按钮,当它点击它会触发doStartAlarm(View v),这个方法会触发一个静态方法startAlarmNow,当我点击按钮它会启动闹钟然后应用程序停止,这是logCat的一部分:

致命的例外:主要

java.lang.IllegalStateException:无法执行活动的方法

引起:android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?

我希望onClick方法doStartAlarm调用静态方法startAlarmNow,所以我可以在实现BroadcastReceiver的类中使用这个静态方法,

这是我的代码。

public class MainActivity extends Activity {
    static Ringtone ringtone = null;
    static AudioManager audioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);


}

    public static void startAlarmNow(Context context) {
    Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

    if (alert == null) {

        alert = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        if (alert == null) {

            alert = RingtoneManager
                    .getDefaultUri(RingtoneManager.TYPE_RINGTONE);
        }

    }
    if (ringtone != null) {
        Toast.makeText(context, "ringtone is  already playing",
                Toast.LENGTH_LONG).show();
    } else {
        ringtone = RingtoneManager.getRingtone(context, alert);

        ringtone.setStreamType(AudioManager.STREAM_ALARM);

        int volume = audioManager
                .getStreamVolume(AudioManager.STREAM_ALARM);
        if (volume == 0) {
            volume = audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_ALARM);
        }
        audioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume,
                AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

        if (ringtone != null) {

            ringtone.play();
            Toast.makeText(context, "ringtone is playing",
                    Toast.LENGTH_LONG).show();

            Intent i = new Intent(context, StopAlarmActivity.class);
            context.startActivity(i);

        }
    }
}

public void doStartAlarm(View v) {
    Context context = getApplicationContext();
    startAlarmNow(context);

}

1 个答案:

答案 0 :(得分:0)

而是使用getApplicationContext()方法使用this引用Activity对象,它也是上下文: startAlarm(this);