0

我想将integer值从ActivityClass( PlayListActivity.java) 传递给我的Service( AudioService.java) 类。但是,当我单击 时ListItem,我的应用程序会停止。我想不出错误。希望有人可以帮助我

logCat 中的错误:

  java.lang.RunTimeException: error recieveing broadcast Intent {act-com.exaple.serviceaudio.AudioService.PLAY_SONG flg=0x10 (has extras)} in com.example.serviceaudio.AudioService$AudioPlayerBroadcastReciever@41b4e818.........

这是我的代码。

PlayLlistActivity.java

    lv.setOnItemClickListener(new OnItemClickListener() {
@Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

        playSongSong(position);         
            }});

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    unbindService(serviceConnection);
    super.onDestroy();

}

public void playSongSong(int songIndex){
    Intent intent = new Intent(AudioService.PLAY_SONG);
    intent.putExtra("songIndex", songIndex);
    this.sendBroadcast(intent);
    }

音频服务.java

public static final String PLAY_SONG_BASE = "com.example.serviceaudio.AudioService";
public static final String PLAY_SONG = PLAY_SONG_BASE + ".PLAY_SONG";
private AudioPlayerBroadcastReceiver broadcastReceiver = new AudioPlayerBroadcastReceiver();

@Override
public void onCreate() {
    Log.v("AudioService", "AudioPlayer: onCreate() called");
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(PLAY_SONG);
    registerReceiver(broadcastReceiver, intentFilter);            
}

public void onDestroy() {

    unregisterReceiver(broadcastReceiver);
}

private class AudioPlayerBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
       int currentSongIndex = intent.getExtras().getInt("songIndex");


        if(PLAY_SONG.equals(action)) {
            Log.d("AudioService", "Action not recognized: " + action);
            playSong(currentSongIndex); 
}}

当我评论int currentSongIndex = intent.getExtras().getInt("songIndex");和`playSong(currentSongIndex); 没有错误,但什么也不做。

4

2 回答 2

0

当您面临问题时,有一种使用活动数据的最佳方法,即通过来自活动的共享偏好来存储价值,如下所示:

 String share_pref_file = "song_index_file";      
 SharedPreferences prefs1 = getSharedPreferences(
            share_pref_time_file, Context.MODE_PRIVATE);
 SharedPreferences.Editor editor1 = prefs1.edit();
 editor1.putString("songIndex", formattedDate);
 editor1.commit();

并像这样从服务中获取它:

 String share_pref_file = "song_index_file";
 SharedPreferences prefs = getSharedPreferences(share_pref_file,
        Context.MODE_PRIVATE);
 String strJson = prefs.getString("songIndex", "");

这种技术可能会对您有所帮助。

于 2013-08-26T09:18:31.223 回答
0

BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。

这对你在 onReceive(Context, Intent) 实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但此时 BroadcastReceiver 是不再活动,因此系统可以在异步操作完成之前自由地终止其进程。

简而言之,广播接收器的寿命很短,并且镜头不能在其中执行任何长时间运行的任务。最大程度地尝试提出一个意图并在那里完成工作。

这会导致您崩溃,并且当您评论它对您有用时。

于 2013-08-26T09:12:24.327 回答