У меня есть простой виджет, который воспроизводит звуковой файл при нажатии.Прямо сейчас у меня есть этот код в методе onRecieve:
@Override
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
int id = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
SharedPreferences prefs = context.getSharedPreferences(CreateWidget.PREFS, 0);
Log.d("WORKING",SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id+" = "+prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "FAILURE"));
Log.d("WORKING", "Received Intent: " + intent.getAction());
if (intent.getAction().equals(ACTION_PLAY_SOUND))
{
try
{
if(mPlayer != null)
{
mPlayer.stop();
mPlayer.release();
Uri sfxURI= Uri.parse(prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "null"));
mPlayer.setDataSource(context, sfxURI);
mPlayer.prepare();
mPlayer.start();
Log.d("WORKING","MediaPlayer already existed, released it");
}
else
{
Uri sfxURI= Uri.parse(prefs.getString(SFXAppWidgetProvider.KEY_SFX_URI_PREFIX+id, "null"));
mPlayer = MediaPlayer.create(context, sfxURI);
mPlayer.start();
Log.d("WORKING","MediaPlayer did not exist, making a new one");
}
} catch (IllegalStateException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (SecurityException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
Что происходит, так это то, что журнал постоянно сообщает, что создает новый экземпляр MediaPlayer каждый раз, когда я воспроизводю звук.Я предполагаю, что AppWidgetRecievers / BroadcastReceivers не должны иметь объекты или что-то?Кто-нибудь знает альтернативный способ воспроизведения звуков (желательно легкий, так как это всего лишь виджет. И я думаю, что может быть более эффективно использовать SoundPool, поскольку возможно иметь несколько разных звуков)?