- 浏览: 465300 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
baiyingtao:
这些信息不太够,我们希望得到相关Keyword的段落,页码,区 ...
Lucene学习之使用Apache Tika进行文档内容抽取 -
王爱学志:
boolean isExist=false; 可以不用直接用 ...
去掉数组中重复元素的最高效算法 -
gavinj:
这些版本都太老了,这里贴出了xcode6系列下载地址,需要的朋 ...
xcode的各个版本的下载地址 -
最美的风景:
帮我大忙了
Android获得Location信息的方法 -
harvin:
yangwei0915 写道可以转载!谢谢。
android 中判断WiFi是否可用的可靠方法
在很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。
为了处理这种后台进程,Android引入了Service的概念。Service在Android中是一种长生命周期的组件,它不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如文件下载程序,它可以在后台执行文件的下载。启动一个服务有两种方式,分别是采用startService方法和绑定Service的方式。在第一种方式启动后,Service会持续运行,直到调用stopService()或stopSelf()方法,如果调用方(例如在Activity中)销毁了,服务仍然还会运行。而第二种是先绑定后启动,绑定一个服务后调用方可以启动服务,并且能和服务依照定义的接口进行通信,并且还能接收服务方发送的广播消息,。我们先来看看第一种,在这个例子中我们实现一个使用Service播放音乐,在Activity界面上使用两个按钮, 分别控制服务的启动的停止。
使用startService方法启动服务
界面PlayActivity.java
package com.usestart.example; import com.usestart.example.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class PlayActivity extends Activity implements OnClickListener { private static final String TAG = "com.example1.PlayActivity"; Button buttonStart, buttonStop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonStart = (Button) findViewById(R.id.buttonStart); buttonStop = (Button) findViewById(R.id.buttonStop); buttonStart.setOnClickListener(this); buttonStop.setOnClickListener(this); } public void onClick(View src) { switch (src.getId()) { case R.id.buttonStart: Log.d(TAG, "onClick: starting srvice"); startService(new Intent(this, PlayService.class)); break; case R.id.buttonStop: Log.d(TAG, "onClick: stopping srvice"); stopService(new Intent(this, PlayService.class)); break; } } @Override protected void onDestroy() { Log.i(TAG, "----Activity is onDestroy"); super.onDestroy(); } }
后台服务PlayService.java
package com.usestart.example; import java.io.IOException; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class PlayService extends Service { private static final String TAG = "com.example.PlayService"; MediaPlayer player; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show(); Log.d(TAG, "onCreate"); player =new MediaPlayer(); try { player.setDataSource("http://content.12530.com/upload/rings2/20090519/600618000223600902000001132715/000053488222_000019.mp3"); player.prepare(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } player.setLooping(true); // Set looping } @Override public void onDestroy() { Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show(); Log.d(TAG, "onDestroy"); player.stop(); } @Override public void onStart(Intent intent, int startid) { Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); player.start(); } }
在这个示例中我们演示了使用第一种方法启动一个服务,在界面上点击start按钮,后服务启动,音乐开始播放,点击Stop按钮服务停止和销毁,音乐停止播放。当点击手机上的回退按钮时我们发现Activity的onDestroy被调用,但是Service的onDestroy并未被调用,音乐也一直播放,直到再重新进入程序点击Stop按钮,服务的onDestroy才被调用。并且我们在界面上反复点击Start按钮,发现onStart回被多次调用,但是并没有多个音乐在播放,可以发现一个服务一旦启动了,再次调用star这个服务,onStart方法也被调用,但是不能导致再次启动这个服务。
使用bind方式来启动服务
package com.usebind.example; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class PlayActivity2 extends Activity implements OnClickListener{ private static final String TAG = "com.example1.PlayActivity2"; Button buttonStart, buttonStop; Intent serviceIntent; ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i("INFO", "------------Service bind"); } @Override public void onServiceDisconnected(ComponentName arg0) { Log.i("INFO", "--------Service unBind"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonStart = (Button) findViewById(R.id.buttonStart); buttonStop = (Button) findViewById(R.id.buttonStop); buttonStart.setOnClickListener(this); buttonStop.setOnClickListener(this); serviceIntent = new Intent(this, PlayService.class); bindService(serviceIntent, conn, BIND_AUTO_CREATE); } public void onClick(View src) { switch (src.getId()) { case R.id.buttonStart: Log.d(TAG, "onClick: starting srvice"); //startService(new Intent(this, PlayService.class)); //bindService(new Intent("com.wissen.testApp.service.MY_SERVICE"), conn, Context.BIND_AUTO_CREATE); Intent i = new Intent(this, PlayService.class); this.startService(i); break; case R.id.buttonStop: Log.d(TAG, "onClick: stopping srvice"); unbindService(conn); //只有unbind之后调用stop才能将服务停止 stopService(new Intent(this, PlayService.class)); break; } } @Override protected void onDestroy() { Log.d(TAG, "----Activity is onDestroy"); unbindService(conn); super.onDestroy(); } }
使用bind方式方式时,在调用方调用bindService方法之后,服务并没有启动,只有在调用了startService方法之后服务才被启动。并且在Activity销毁时必须调用unbindService断开和这个服务的连接,否则程序回出错。如果是网速较慢或其他原因在运行上面的例子时回出现 no response错误,程序退出。导致这个原因是因为在service的onCreate方法是在主线程中运行的,不能出现运行耗时较长的代码,如果出现耗时较长的操作会将cpu阻塞住,这样很容易出现no response的错误.所以在编写一个服务时应将运行耗时较长的代码放到另外一个线程中或AsyncTask的doInBackground方法中执行。
在附件中ServicesPlay1是使用第一种方式,ServicesPlay1使用第二种方式的示例代码。
- ServicesPlay1.rar (28.7 KB)
- 下载次数: 13
- ServicesPlay2.rar (27.5 KB)
- 下载次数: 13
发表评论
-
Android的开发规范整理之界面刷新
2018-05-17 11:04 5641.后一个界面(Activity)的操作导致前一个界面(A ... -
Android的开发规范整理之Handler的使用
2018-05-17 10:53 7151.关于Handler的使用,在Activity或者Ser ... -
Android TV开发之模拟器的设置
2017-12-10 13:36 2073在进行Android TV开发时,会碰见模拟器显示的效果跟 ... -
activity 启动service的三种方式区别
2017-06-10 11:01 577在Activity中启动Service有三种情况,具体的启 ... -
android 获取sd卡路径的两种方法
2018-05-17 11:20 1292/** * 方法一 * @return ... -
android NDK 开发环境搭建
2016-08-20 21:46 6361.下载android ndk 推荐版本为:android ... -
android进阶-----解决scrollview嵌套listview的问题
2016-08-15 16:40 343在android开发中,经常会碰到在ScrollView中 ... -
部分android手机不支持USB Host功能
2015-11-02 16:07 1425在android开发USB功能时,少部分android的手 ... -
PhoneGap 安装配置时遇到的问题及解决办法
2015-09-23 14:36 994PhoneGap在3.0之后就不能 ... -
解决 “android New package not yet registered with the system.”问题
2015-05-03 12:21 1566在android开发中因为更换包名或者为activity设置 ... -
Xcode真机调试 could not lunch failed to get reply to handshake packet
2015-01-31 23:25 4080解决的办法是 通用--->还原--->还原所有设置 ... -
android使用.9,png图片作为背景的问题
2014-10-30 10:11 3393在android的开发中,很多的时候需要使用.9.png来做为 ... -
android的小问题:You need to use a Theme.AppCompat theme
2014-07-30 16:43 7256android的一个小问题: Caused by: ... -
ViewPager中添加百度地图MapView,Page切换时地图显示黑屏问题
2014-05-14 11:47 7258在ViewPager的选项卡中增加的Page多余3个,如果 ... -
百度地图与高德地图坐标转换
2014-05-13 10:42 2609android项目使用了百度地图的定位SDK,web端使用的 ... -
拟物化化设计和扁平化设计
2014-03-20 17:32 11231. 拟物化设计 skeuomorphism 代表作 ... -
html5在移动开发中优势和劣势
2014-03-06 10:46 3320现在html5的应用已经非常广泛了,尤其是在移动端得到了较 ... -
android Button selector不起作用
2013-11-24 20:43 2272我们在Android开发中,经常需要设置Button在不同 ... -
Android Button快速滑过,ACTION_UP事件不触发的问题的解决
2013-10-16 15:56 6362在android界面编程时,经常要实现当Button一直 ... -
Android调用系统短信功能发送短信
2013-04-17 15:28 1226android调用系统短信功能发送短信有两种方法, 第一 ...
相关推荐
Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
首先,我们来了解一下android的测试类的层次结构:可以看出android中的测试方法主要有AndroidTextCase和InstrumentationTextCase。在这篇文章中,我将介绍Instrumentation这种测试方法,那么什么是Instrumentation?...
Android Apk解密工程初探
开放手持装置联盟(Open Handset Alliance)由包括摩托罗拉、宏达电、三星、LG等在内的多家知名厂商共同成立,它们致力于基于Android平台开发新的智能手机和服务。 Android SDK(软件开发工具包)是Google为了方便...
这个是我在华为进行培训自己写的ppt,欢迎下载.
Android TensorFlow Lite 初探 数字分类器 非kotlin 相关文章:https://blog.csdn.net/ansondroider/article/details/108508065 修改后的JAVA代码
在Android应用开发中,Fragment是Activity的一个模块化组件,它允许开发者将屏幕的不同部分独立管理。"Android fragment懒加载"是指在用户实际需要时才加载Fragment中的数据或视图,而不是在Fragment创建时立即加载...
- `RemoteViews`:用于构建和修改AppWidget的视图结构,它可以操作位于远程服务中的视图,确保安全性和性能。 3. **创建AppWidget的步骤** - 首先,在`AndroidManifest.xml`中声明`AppWidgetProvider`,并提供`...
Android Apk解密工程初探(打包)
### Kotlin初探与集成Android项目 #### 一、了解Kotlin **Kotlin的背景:** Kotlin 是一种由 JetBrains 开发的静态类型编程语言,它最初发布于 2011 年,并且在 2017 年被 Google 宣布成为 Android 的官方开发...
《Android开发常用技术初探》 在移动互联网的飞速发展中,Android系统占据了智能手机市场的主要份额,成为开发者和用户关注的焦点。Android以其开源、灵活的特性吸引了众多开发者,不断推动着应用程序的创新和发展...
综上所述,基于Scrum的教学法不仅能够解决传统Android教学中存在的问题,还能够帮助学生在实践中学习Android开发所需的各项专业技能。通过创建接近实际工作环境的学习氛围,这种方法能够有效提升学生的职业技能和...
"入门--初探Android" Android是一个基于Linux核心(kernel)的开源手机操作系统平台。它于2007年11月5日由Google与其他33家手机制造商、手机晶片供应商、软件供应商、电信运营商所组成的开放手机联盟(Open Handset ...
【Android自动化测试初探】 Android自动化测试是一种针对Android应用程序进行的自动化的质量验证过程,它旨在减少手动测试的重复劳动,提高测试效率和覆盖率。在Android系统中,自动化测试通常涉及UI测试、功能测试...
首先,我们了解到传统的Android自动化测试通常依赖于JUnit框架和Android SDK中的`android.test`包,但这需要应用程序的源代码,这对于许多只做黑盒测试的测试工程师来说并不实际。 Android系统中的权限控制严格限制...
1. 选择`File` -> `New` -> `Project...`,然后在弹出的窗口中选择`Android` -> `Android Project`,或者通过`File` -> `New` -> `Other...`,然后选择`Android` -> `Android Project`。 2. 输入唯一的工程名称,...