Service和IntentService
2015-09-09 21:54
459 查看
服务Service的含义
Service和IntentService的区别
主函数
MyService
MyIntentService
布局
需要注意的是:
服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止运行。
另外,服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的,也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
每一个*服务都需要在AndroidManifest.xml文件中进行注册才能生效,当然这是四大组件共有的特点——
2、IntentService是继承Service的,它包含了Service的全部特性,当然也包含service的生命周期,与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去执行自己的耗时操作。
Service和IntentService的区别
主函数
MyService
MyIntentService
布局
服务(Service)的含义
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要长期运行的任务,服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序服务仍然能够保持正常运行。需要注意的是:
服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止运行。
另外,服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的,也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
每一个*服务都需要在AndroidManifest.xml文件中进行注册才能生效,当然这是四大组件共有的特点——
<service android :name=".MyService"></service>*
Service和IntentService的区别
1、Service中的onCreate()方法是在服务第一次创建时调用的,而onStartCommand()方法则在每次启动服务的时候都会调用,所以如果我们希望服务一旦启动就立刻执行某个动作,就可以将逻辑写在onStartCommand()方法里。2、IntentService是继承Service的,它包含了Service的全部特性,当然也包含service的生命周期,与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去执行自己的耗时操作。
主函数
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mButtonStart; private Button mButtonStop; private Button mButtonStartDownload; private ProgressBar mProgressBar; private MyDownLoadReceiver receiver; public static final String DOWN_LOAD_ACTION="com.example.test"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //因为用到了BroadcastReceiver,所以这里需要一个继承了BroadcastReceiver类的(MyDownLoadReceiver)类的实例, receiver=new MyDownLoadReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction(DOWN_LOAD_ACTION); registerReceiver(receiver,filter);//有了这个注册,下面必须要写一个对应的反注册才不会出错。 mButtonStart= (Button) findViewById(R.id.button_start_service); mButtonStop= (Button) findViewById(R.id.button_stop_service); mButtonStart.setOnClickListener(this); mButtonStop.setOnClickListener(this); mButtonStartDownload= (Button) findViewById(R.id.button_start_download); mButtonStartDownload.setOnClickListener(this); mProgressBar= (ProgressBar) findViewById(R.id.progressBar); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver);//对应上面的registerReceiver } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_start_service: // Intent intent=new Intent(getApplicationContext(),MyService.class); // startService(intent); break; case R.id.button_stop_service: // Intent intent1=new Intent(getApplicationContext(),MyService.class); Intent intent1=new Intent(getApplicationContext(),MyIntentService.class); stopService(intent1); break; case R.id.button_start_download: // Intent intent2=new Intent (getApplicationContext(),MyService.class); Intent intent2=new Intent (getApplicationContext(),MyIntentService.class); startService(intent2); default: break; } } class MyDownLoadReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { int count=intent.getIntExtra("count",0); mProgressBar.setProgress(count); } } }
MyService
/** * Created by Administrator on 2015/9/8. */ public class MyService extends Service{ //服务是可在后台运行的 private int count=0; @Override public void onCreate() { super.onCreate(); Log.d("", "onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("","onStartCommand"); new Thread(new Runnable() { @Override public void run() { while(true){ if(count>100){ count=0; } count++; Intent intent=new Intent(); intent.setAction(MainActivity.DOWN_LOAD_ACTION); intent.putExtra("count", count); sendBroadcast(intent); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("", "onDestroy"); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
MyIntentService
/** * Created by Administrator on 2015/9/9. */ public class MyIntentService extends IntentService { private int count=0; public MyIntentService(String name){ super(name); } public MyIntentService(){ this(""); } @Override public void onDestroy() { Log.d("intentService","服务关闭"); super.onDestroy(); } @Override protected void onHandleIntent(Intent intent) { Log.d("intentService","运行到IntentService"); while(true){ if(count>100){ count=0; } count++; Intent intent1=new Intent(); intent1.setAction(MainActivity.DOWN_LOAD_ACTION); intent1.putExtra("count", count); sendBroadcast(intent1); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }
布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <Button android:id="@+id/button_start_service" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:text="启动服务"/> <Button android:id="@+id/button_stop_service" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止服务"/> <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:minHeight="50dp" android:progress="50"/> <Button android:id="@+id/button_start_download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始下载"/> </LinearLayout>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories