2010-03-21 9 views
0

J'ai un récepteur qui fonctionne bien, mais je ne peux pas sembler montrer une interface utilisateur correcte, bien que le pain grillé apparaisse correctement. Pour autant que je sache, cela est dû au fait qu'Android demande à la classe d'étendre l'activité, mais la classe étend déjà BroadcastReciever, donc je ne peux pas le faire. Donc, j'ai essayé de faire une Intention, mais cela a échoué aussi. Il n'y a pas d'erreurs, mais l'écran ne s'affiche pas. Le code source est ci-dessous, et toute aide serait très appréciée.Obtenir de Android BroadcastReciever à une interface utilisateur

Broadcast (Procédé 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(); 
} 

Reciever

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); 
    } 
} 

Reciever 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> 
} 

Répondre

3

Dans une BroadcastReceiver méthode onReceive(), si vous avez besoin d'un Context (par exemple, pour créer un Intent), utilisez la Context qui est passé à vous en tant que paramètre de onReceive(). Vous avez même ce code dans votre onReceive() - vous ne faites rien avec le résultat Intent (par exemple, en appelant startActivity()).

+0

RecieverV2 ci-dessus, maintenant juste bloque l'application lorsque le destinataire est appelé. Il semble vouloir un drapeau de genres, mais je ne sais pas comment mettre en place cela. LogCat: 03-21 23: 05: 45.573: ERROR/AndroidRuntime (769): java.lang.RuntimeException: impossible de démarrer le récepteur com.comaad.andyroidalarm.Reciever: android.util.AndroidRuntimeException: Appel startActivity() de l'extérieur d'un Le contexte d'activité requiert l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que tu veux? – Andy

+2

Eh bien, démarrer une activité à partir d'un récepteur de diffusion est une opération inhabituelle. Pour la plupart des applications, lancer une activité à l'improviste rendra l'utilisateur très en colère. Une application de réveil est l'un des rares qui le justifie. Suivez les instructions dans le message d'erreur - ajoutez 'FLAG_ACTIVITY_NEW_TASK' à' Intent' que vous utilisez pour 'startActivity()' - et votre problème disparaîtra avec un peu de chance. – CommonsWare

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

Modifier
Découvrez cet exemple d'utiliser BroadcastReciever au sein d'une activité. http://almondmendoza.com/2009/01/04/getting-battery-information-on-android/

+0

J'ai essayé, mais j'obtiens des erreurs sur le créateur: L'intention du constructeur (Reciever, classe ) est non défini Pour autant que je peux dire, son causé par l'extension Reciever BroadcastReciever, pas d'activité. – Andy

+0

try 'this.getContext();' – Pentium10