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