2010-03-21 2 views
0

У меня есть приемник, который хорошо работает, но я не могу показать правильный пользовательский интерфейс, хотя тост появляется правильно. Насколько я могу судить, это вызвано тем, что Android требует, чтобы класс расширил Activity, однако класс уже расширяет BroadcastReciever, поэтому я не могу этого сделать. Итак, я попытался сделать намерение, но это тоже не удалось. Ошибок нет, но экран не отображается. Исходный код ниже, и любая помощь будет наиболее оценена.Получить от Android BroadcastReciever до пользовательского интерфейса

вещания (метод в AndyRoidAlarm)

public void setAlarm(){ 
    Intent intent = new Intent(AndyRoidAlarm.this, Reciever.class); 
    PendingIntent sender = PendingIntent.getBroadcast(AndyRoidAlarm.this, 
       0, intent, 0); 

    // We want the alarm to go off 30 seconds from now. 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 

    // Schedule the alarm! 
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
    am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); 

    // Tell the user about what we did. 
    if (mToast != null) { 
     mToast.cancel(); 
    } 
    mToast = Toast.makeText(AndyRoidAlarm.this, "Alarm Scheduled for 30secs", Toast.LENGTH_LONG); 
    mToast.show(); 
} 

Ресивер

public class Reciever extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Toast.makeText(context, "Alarm Recieved", Toast.LENGTH_LONG).show(); 
     Intent i = new Intent(); 
     i.setClass(context, AlarmRing.class); 
    } 
} 

Ресивер V2

@Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Toast.makeText(context, "Alarm Recieved", Toast.LENGTH_LONG).show(); 
     Intent foo = new Intent(context, AlarmRing.class); 
     //foo.putExtra("id", "id");//example, if you wish to pass custom variables 
     context.startActivity(foo); 
    } 

AlarmRing

public class AlarmRing extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.alarm); 

     MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.sweetchild); 
     mp.start(); 
    } 

Manifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.comaad.andyroidalarm" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".AndyRoidAlarm" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.comaad.andyroidalarm.Reciever" android:enabled="true"> 
      <intent-filter> 
       <action android:name="com.comaad.andyroidalarm.Reciever"></action> 
      </intent-filter> 
     </receiver> 
     <activity android:name=".AlarmRing"></activity> 
    </application> 
</manifest> 
} 

ответ

3

В методе BroadcastReceiveronReceive(), если вам нужно Context (например, для создания Intent), используйте Context, который передается вам в качестве параметра onReceive(). У вас даже есть этот код в вашем onReceive() - вы просто ничего не делаете с результатом Intent (например, вызывая startActivity()).

+0

RecieverV2 выше, теперь просто сбой приложения, когда вызывается приемник. Кажется, нужен флаг видов, но я не уверен, как это установить. LogCat: 03-21 23: 05: 45.573: ERROR/AndroidRuntime (769): java.lang.RuntimeException: невозможно запустить ресивер com.comaad.andyroidalarm.Reciever: android.util.AndroidRuntimeException: вызов функции startActivity() извне Для контекста действия требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите? – Andy

+2

Ну, начало деятельности от широковещательного приемника - необычная операция. Для большинства приложений всплывающее действие без предупреждения сделает пользователя очень злым. Приложение будильника является одним из немногих, которые его оправдывают. Следуйте инструкциям в сообщении об ошибке - добавьте 'FLAG_ACTIVITY_NEW_TASK' в' Intent', который вы используете для 'startActivity()' - и ваша проблема, надеюсь, исчезнет. – CommonsWare

0
Intent foo = new Intent(this, AlarmRing.class); 
foo.putExtra("id", id);//example, if you wish to pass custom variables 
this.startActivity(foo); 

Редактировать
Заканчивать этот пример, чтобы использовать BroadcastReciever в пределах деятельности. http://almondmendoza.com/2009/01/04/getting-battery-information-on-android/

+0

Я попробовал, что и раньше, но я получаю ошибки на создателе: Конструктор Intent (Ресивер, класс ) не определен Насколько я могу судить, его вызванное Ресивер простирающегося BroadcastReciever, а не активность. – Andy

+0

попробуйте 'this.getContext();' – Pentium10

Смежные вопросы