android BroadcastReceiver 广播 onReceive()执行多次
2013-12-17 15:25
302 查看
功能:下载listView中点击的item数据,
ListView的activity中代码:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Mp3Info mp3Info = this.mp3Infos.get(position);
Intent intent = new Intent();
intent.putExtra("mp3Info", mp3Info);
intent.setClass(this, DownLoadService.class);
this.startService(intent);
receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(ConstantVariable.DOWNLOADACTION);
Mp3ListActivity.this.registerReceiver(receiver,filter);
super.onListItemClick(l, v, position, id);
}
class MyReceiver extends BroadcastReceiver {
public MyReceiver(){}
//点几次listview,这里会执行几次
@Override
public void onReceive(Context arg0, Intent intent) {
Bundle bundle=intent.getExtras();
String resultString = bundle.getString("resultString");
System.out.println(resultString);
}
}
service的代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
DownLoadThread downLoadThread = new DownLoadThread(mp3Info);
Thread thread = new Thread(downLoadThread);
thread.start();
return super.onStartCommand(intent, flags, startId);
}
class DownLoadThread implements Runnable {
Mp3Info mp3Info = null;
public DownLoadThread(Mp3Info mp3Info) {
this.mp3Info = mp3Info;
}
@Override
public void run() {
String mp3Url = "";
try {
mp3Url = ConstantVariable.SERVER_URL
+ URLEncoder.encode(mp3Info.getMp3Name(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpDownloader httpDownloader = new HttpDownloader();
int result = httpDownloader.downFile(mp3Url, "mp3/",
mp3Info.getMp3Name());
String resultsString = mp3Info.getMp3Name();
if (result == -1) {
resultsString += ",下载失败.";
} else if (result == 0) {
resultsString += ",下载成功.";
} else if (result == 1){
resultsString += ",文件已存在.";
}
Intent intent=new Intent();
intent.putExtra("resultString", resultsString);
intent.setAction(ConstantVariable.DOWNLOADACTION);
sendBroadcast(intent);
}
}
androidmanifest.xml注册service
<service android:name="com.nic.service.DownLoadService"></service>
其他的辅助类就不贴代码了。大家知道为什么会这样吗?
------------------------------------------------------------------------------------------------------------------------------------
经过排查发现原因了:
1、不应该在onListItemClick方法里注册receiver,应该在onCreat方法里注册
2、在onListItemClick方法里启动service
2、在onDestroy方法里,注销receiver。
ListView的activity中代码:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Mp3Info mp3Info = this.mp3Infos.get(position);
Intent intent = new Intent();
intent.putExtra("mp3Info", mp3Info);
intent.setClass(this, DownLoadService.class);
this.startService(intent);
receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(ConstantVariable.DOWNLOADACTION);
Mp3ListActivity.this.registerReceiver(receiver,filter);
super.onListItemClick(l, v, position, id);
}
class MyReceiver extends BroadcastReceiver {
public MyReceiver(){}
//点几次listview,这里会执行几次
@Override
public void onReceive(Context arg0, Intent intent) {
Bundle bundle=intent.getExtras();
String resultString = bundle.getString("resultString");
System.out.println(resultString);
}
}
service的代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
DownLoadThread downLoadThread = new DownLoadThread(mp3Info);
Thread thread = new Thread(downLoadThread);
thread.start();
return super.onStartCommand(intent, flags, startId);
}
class DownLoadThread implements Runnable {
Mp3Info mp3Info = null;
public DownLoadThread(Mp3Info mp3Info) {
this.mp3Info = mp3Info;
}
@Override
public void run() {
String mp3Url = "";
try {
mp3Url = ConstantVariable.SERVER_URL
+ URLEncoder.encode(mp3Info.getMp3Name(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpDownloader httpDownloader = new HttpDownloader();
int result = httpDownloader.downFile(mp3Url, "mp3/",
mp3Info.getMp3Name());
String resultsString = mp3Info.getMp3Name();
if (result == -1) {
resultsString += ",下载失败.";
} else if (result == 0) {
resultsString += ",下载成功.";
} else if (result == 1){
resultsString += ",文件已存在.";
}
Intent intent=new Intent();
intent.putExtra("resultString", resultsString);
intent.setAction(ConstantVariable.DOWNLOADACTION);
sendBroadcast(intent);
}
}
androidmanifest.xml注册service
<service android:name="com.nic.service.DownLoadService"></service>
其他的辅助类就不贴代码了。大家知道为什么会这样吗?
------------------------------------------------------------------------------------------------------------------------------------
经过排查发现原因了:
1、不应该在onListItemClick方法里注册receiver,应该在onCreat方法里注册
2、在onListItemClick方法里启动service
2、在onDestroy方法里,注销receiver。
相关文章推荐
- Android中Acition和Category常量表
- Android之Adapter用法总结
- android progressbar
- Android4.2上传图片且保存至数据库中
- 【转自唐忍】Android无线调试——抛开USB数据线
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- android 生成xml文件
- android PopupWindow
- android异步类AsyncTask
- Android Developers:拖动和缩放
- Android Canvas
- Android--输入自动提示AutoCompleteTextView
- [原]android不支持命名的semaphore
- Android深入浅出之Audio第三部分Audio Policy[1]
- Android深入浅出之Audio 第二部分 AudioFlinger分析
- android为RadioButton动态添加style样式
- 菜鸟Android学习之路02——代码控制IU界面
- 【转自唐忍】Android中IntentService的原理及使用
- Android深入浅出之Audio 第一部分 AudioTrack分析
- Android iOS Dribbble风格边栏菜单实现