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