首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BroadcastReceiver传值错误

BroadcastReceiver传值错误
EN

Stack Overflow用户
提问于 2013-08-26 17:00:25
回答 2查看 94关注 0票数 0

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

logCat中的错误:

代码语言:javascript
复制
  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

代码语言:javascript
复制
    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);
    }

AudioService.java

代码语言:javascript
复制
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)时,没有错误,但什么也没做。

EN

回答 2

Stack Overflow用户

发布于 2013-08-26 17:12:24

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

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

简而言之,广播接收机的寿命很短,而且不能在其中做任何长时间运行的任务。在最大限度上,试着提出一个意图,并在那里做工作。

这对你造成了崩溃,当你评论它对你很好的时候。

票数 0
EN

Stack Overflow用户

发布于 2013-08-26 17:18:31

当你遇到问题时,有一个最好的方法来使用活动的数据,即通过共享首选项从活动中存储值,如下所示:

代码语言:javascript
复制
 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();

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

代码语言:javascript
复制
 String share_pref_file = "song_index_file";
 SharedPreferences prefs = getSharedPreferences(share_pref_file,
        Context.MODE_PRIVATE);
 String strJson = prefs.getString("songIndex", "");

这个技巧可能会对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18440364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档