主屏幕小部件 - 仅在新实例时更新
HomeScreen Widget - Updates Only When New Instance
我的主屏幕上有一个小部件,负责显示当前歌曲,并且可以切换歌曲等等...目前我只是想实现它显示当前歌曲的功能。
我已附上所有相关代码...以及评论。没有抛出错误并且它确实更新但只有当我在主屏幕上创建小部件的新实例时才会更新。为了解释我是否在开始播放歌曲之前放了一个小部件,它会说 "Not Playing" 当我开始从我的应用程序播放歌曲时它会更新但仍然会继续说 "Not Playing" 然后什么时候我创建了一个相同类型的新小部件并将其放下,它将保留更新的信息,而旧的仍然会说不播放。如果我更改歌曲,我刚放置的歌曲不会更新,siad 未播放但创建新歌曲的歌曲也不会更新,这将继续...
MainActivity 正在接收来自 MusicManager 的调用并发送小部件更新(有效吗?)
public MusicManager musicManager = MusicManager.getInstance(new MusicManager.MediaplayerUpdateInterface() {
public void updateUI(int type) {
updateMediaplayerViews(type);
}
});
public void updateMediaplayerViews(int type) {
switch(type) {
case 0:
this.runOnUiThread(new Runnable() {
public void run() {
System.out.println("value? "+(musicManager.getCurrentTimeBAR()/musicManager.getSongLengthBAR()));
SongListFragment.musicManagerProgress.setProgress((int)((musicManager.getCurrentTimeBAR()/(double)musicManager.getSongLengthBAR())*100));
SongListFragment.musicManagerCurrent.setText(musicManager.getCurrentTime());
if(!SongListFragment.hasSetImage) {
SongListFragment.musicManagerTotal.setText(musicManager.getSongLength());
SongListFragment.musicManagerSongName.setText(musicManager.getCurrentSongInfo().getName().length() > 22 ? musicManager.getCurrentSongInfo().getName().substring(0, 19) + "..." : musicManager.getCurrentSongInfo().getName());
new DownloadListAdapter.DownloadImageTask(SongListFragment.musicManagerImageView).execute(musicManager.getCurrentSongInfo().getImgurl());
SongListFragment.hasSetImage = true;
}
}
});
break;
case 10:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getBaseContext(), TrinityWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = {TrinityWidget.widgetId};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
getBaseContext().sendBroadcast(intent);
}
});
break;
}
}
MusicManager 正在发送更新(有效)
public static MusicManager myInstance;
private boolean songHasChanged;
public MusicManager(MediaplayerUpdateInterface inter) {
this.player = new MediaPlayer();
this.uiUpdateInterface = inter;
executorService.submit(new Runnable() {
@Override
public void run() {
while (true) {
if(songHasChanged) {
uiUpdateInterface.updateUI(10);
songHasChanged = false;
}
if (player.isPlaying()) {
uiUpdateInterface.updateUI(0);
}
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public static MusicManager getInstance(MediaplayerUpdateInterface inter) {
if (myInstance == null)
return myInstance = new MusicManager(inter);
else
return myInstance;
}
小部件代码(有问题?)
public class TrinityWidget extends AppWidgetProvider {
public static boolean needsImage;
public static final int widgetId = 188772;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
}
}
// the below method is where it updates i believe it does work but the updates don't apply until A new widget is created?
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
try {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.trinity_widget);
if (MusicManager.myInstance != null) {
views.setTextViewText(R.id.widgetsongtext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getName() : "Not Playing");
views.setTextViewText(R.id.widgetartisttext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getArtist() : "Not Playing");
} else {
views.setTextViewText(R.id.widgetsongtext, "Not Playing");
views.setTextViewText(R.id.widgetartisttext, "Not Playing");
}
appWidgetManager.updateAppWidget(appWidgetId, views);
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onEnabled(Context context) {
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}
基本上看起来所有小部件都不会更新,直到我手动重新创建它们。他们更新了新的。
问题是我出于某种原因没有更新正确的 ID...无论哪种方式,我现在都根据 class 进行了更新。喜欢下面
ComponentName projectWidget = new ComponentName(context, TrinityWidget.class);
appWidgetManager.updateAppWidget(projectWidget, views);
我的主屏幕上有一个小部件,负责显示当前歌曲,并且可以切换歌曲等等...目前我只是想实现它显示当前歌曲的功能。
我已附上所有相关代码...以及评论。没有抛出错误并且它确实更新但只有当我在主屏幕上创建小部件的新实例时才会更新。为了解释我是否在开始播放歌曲之前放了一个小部件,它会说 "Not Playing" 当我开始从我的应用程序播放歌曲时它会更新但仍然会继续说 "Not Playing" 然后什么时候我创建了一个相同类型的新小部件并将其放下,它将保留更新的信息,而旧的仍然会说不播放。如果我更改歌曲,我刚放置的歌曲不会更新,siad 未播放但创建新歌曲的歌曲也不会更新,这将继续...
MainActivity 正在接收来自 MusicManager 的调用并发送小部件更新(有效吗?)
public MusicManager musicManager = MusicManager.getInstance(new MusicManager.MediaplayerUpdateInterface() {
public void updateUI(int type) {
updateMediaplayerViews(type);
}
});
public void updateMediaplayerViews(int type) {
switch(type) {
case 0:
this.runOnUiThread(new Runnable() {
public void run() {
System.out.println("value? "+(musicManager.getCurrentTimeBAR()/musicManager.getSongLengthBAR()));
SongListFragment.musicManagerProgress.setProgress((int)((musicManager.getCurrentTimeBAR()/(double)musicManager.getSongLengthBAR())*100));
SongListFragment.musicManagerCurrent.setText(musicManager.getCurrentTime());
if(!SongListFragment.hasSetImage) {
SongListFragment.musicManagerTotal.setText(musicManager.getSongLength());
SongListFragment.musicManagerSongName.setText(musicManager.getCurrentSongInfo().getName().length() > 22 ? musicManager.getCurrentSongInfo().getName().substring(0, 19) + "..." : musicManager.getCurrentSongInfo().getName());
new DownloadListAdapter.DownloadImageTask(SongListFragment.musicManagerImageView).execute(musicManager.getCurrentSongInfo().getImgurl());
SongListFragment.hasSetImage = true;
}
}
});
break;
case 10:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getBaseContext(), TrinityWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = {TrinityWidget.widgetId};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
getBaseContext().sendBroadcast(intent);
}
});
break;
}
}
MusicManager 正在发送更新(有效)
public static MusicManager myInstance;
private boolean songHasChanged;
public MusicManager(MediaplayerUpdateInterface inter) {
this.player = new MediaPlayer();
this.uiUpdateInterface = inter;
executorService.submit(new Runnable() {
@Override
public void run() {
while (true) {
if(songHasChanged) {
uiUpdateInterface.updateUI(10);
songHasChanged = false;
}
if (player.isPlaying()) {
uiUpdateInterface.updateUI(0);
}
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public static MusicManager getInstance(MediaplayerUpdateInterface inter) {
if (myInstance == null)
return myInstance = new MusicManager(inter);
else
return myInstance;
}
小部件代码(有问题?)
public class TrinityWidget extends AppWidgetProvider {
public static boolean needsImage;
public static final int widgetId = 188772;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
}
}
// the below method is where it updates i believe it does work but the updates don't apply until A new widget is created?
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
try {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.trinity_widget);
if (MusicManager.myInstance != null) {
views.setTextViewText(R.id.widgetsongtext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getName() : "Not Playing");
views.setTextViewText(R.id.widgetartisttext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getArtist() : "Not Playing");
} else {
views.setTextViewText(R.id.widgetsongtext, "Not Playing");
views.setTextViewText(R.id.widgetartisttext, "Not Playing");
}
appWidgetManager.updateAppWidget(appWidgetId, views);
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onEnabled(Context context) {
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}
基本上看起来所有小部件都不会更新,直到我手动重新创建它们。他们更新了新的。
问题是我出于某种原因没有更新正确的 ID...无论哪种方式,我现在都根据 class 进行了更新。喜欢下面
ComponentName projectWidget = new ComponentName(context, TrinityWidget.class);
appWidgetManager.updateAppWidget(projectWidget, views);