Android 获取以前调用的活动/意图
我正在尝试在android中构建一个mp3播放器。我有一个带有3个按钮的主要活动,如下所示:正在播放、我的歌曲和设置。每个按钮都有一个onclick侦听器。除了一个例外,一切都很完美:当我点击MySongs ListActivity中的一首歌曲时,播放器被加载,歌曲开始播放。当我通过安卓设备上的“后退”按钮返回主菜单,然后再次单击MySongs,然后选择一首新歌时,一个新播放器被加载,旧播放器继续播放,因此现在播放的是两首歌曲,而不仅仅是新歌曲。我认为问题在于我使用意图的方式 mainActivity类(我省略了与此问题无关的代码) 现在是玩家类(同样,我省略了一些我认为不重要的东西)Android 获取以前调用的活动/意图,android,android-intent,android-activity,Android,Android Intent,Android Activity,我正在尝试在android中构建一个mp3播放器。我有一个带有3个按钮的主要活动,如下所示:正在播放、我的歌曲和设置。每个按钮都有一个onclick侦听器。除了一个例外,一切都很完美:当我点击MySongs ListActivity中的一首歌曲时,播放器被加载,歌曲开始播放。当我通过安卓设备上的“后退”按钮返回主菜单,然后再次单击MySongs,然后选择一首新歌时,一个新播放器被加载,旧播放器继续播放,因此现在播放的是两首歌曲,而不仅仅是新歌曲。我认为问题在于我使用意图的方式 mainActiv
public类播放器扩展活动实现OnCompletionListener、OnSeekBarChangeListener{
私人媒体播放器;
私有处理程序mHandler=新处理程序();
私人歌曲管理者sm;
私有int currentSongIndex=0;
私有布尔isplay=false;
私有布尔值isShuffle=false;
私有布尔值isRepeat=false;
private ArrayList songsList=new ArrayList();
@凌驾
创建时的公共void(Bundle sIS){
super.onCreate(sIS);
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
这个.setContentView(R.layout.player);
mp=新媒体播放器();
sm=新歌曲管理器();
mp.setOnCompletionListener(此);
songsList=sm.getSongList();
startActivityForResult(新意图(getApplicationContext(),SongsList.class),100);
}
...
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
如果(结果代码==100){
currentSongIndex=data.getExtras().getInt(SongsManager.INDEX);
播放歌曲(当前歌曲索引);
}
};
...
最后,歌曲列表课
public class SongsList extends ListActivity {
public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
private String[] songTitles;
MainActivity main;
public void onCreate(Bundle sIS){
super.onCreate(sIS);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.songslist);
SongsManager sm = new SongsManager();
this.songsList = sm.getSongList();
this.songTitles = new String[songsList.size()];
for (int i = 0; i < songsList.size(); i += 1){
try {
songTitles[i] = (String)songsList.get(i).get(SongsManager.KEY_TITLE);
} catch (Exception e){
Log.d("SongsList", "Class Cast Exception");
}
}
this.setListAdapter(new SongListAdapter());
ListView lv = this.getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
int songIndex = position;
Intent i = new Intent(getApplicationContext(), Player.class);
i.putExtra(SongsManager.INDEX, songIndex);
setResult(100, i);
finish();
}
});
}
...
公共类歌曲列表扩展了ListActivity{
public ArrayList songsList=new ArrayList();
私人字符串[]歌曲名称;
主要活动主要;
创建时的公共void(Bundle sIS){
super.onCreate(sIS);
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
setContentView(R.layout.songslist);
SongsManager sm=新的SongsManager();
this.songsList=sm.getSongList();
this.songTitles=新字符串[songsList.size()];
对于(int i=0;i
如果您有任何见解,我将不胜感激。我正试图按照以下思路做一些事情:
Player.getIntent()或类似的东西,而不是调用新的Intent。是的,问题是无法确保您现在看到的活动是同一个活动实例(在本例中是Player)这绝对不是您在MainActivity中创建的实例。您不应该创建Activity的实例 您必须弄清楚(欢迎使用Android)如何将您的整个状态保持在您用来启动新活动的意图中,或者保持在您调用的捆绑包中
sIS
看一看服务类。我想你会想让你的播放器成为一个服务,而不是一个活动。想想web服务器。一个活动是一个servlet,UI。中间件应该存在于一个服务中
public class Player extends Activity implements OnCompletionListener, OnSeekBarChangeListener{
private MediaPlayer mp;
private Handler mHandler = new Handler();
private SongsManager sm;
private int currentSongIndex = 0;
private boolean isPlaying = false;
private boolean isShuffle = false;
private boolean isRepeat = false;
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
@Override
public void onCreate(Bundle sIS){
super.onCreate(sIS);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(R.layout.player);
mp = new MediaPlayer();
sm = new SongsManager();
mp.setOnCompletionListener(this);
songsList = sm.getSongList();
startActivityForResult(new Intent(getApplicationContext(), SongsList.class), 100);
}
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100){
currentSongIndex = data.getExtras().getInt(SongsManager.INDEX);
playSong(currentSongIndex);
}
};
...
public class SongsList extends ListActivity {
public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
private String[] songTitles;
MainActivity main;
public void onCreate(Bundle sIS){
super.onCreate(sIS);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.songslist);
SongsManager sm = new SongsManager();
this.songsList = sm.getSongList();
this.songTitles = new String[songsList.size()];
for (int i = 0; i < songsList.size(); i += 1){
try {
songTitles[i] = (String)songsList.get(i).get(SongsManager.KEY_TITLE);
} catch (Exception e){
Log.d("SongsList", "Class Cast Exception");
}
}
this.setListAdapter(new SongListAdapter());
ListView lv = this.getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
int songIndex = position;
Intent i = new Intent(getApplicationContext(), Player.class);
i.putExtra(SongsManager.INDEX, songIndex);
setResult(100, i);
finish();
}
});
}
...