Android Service与Thread详解
2015-08-29 13:25
405 查看
service是在主线程中运行的,我们要处理耗时操作是在服务里还要新建线程,那服务有什么好处呢?
服务一旦运行,程序退出是不会被销毁的(最好的例子就是播放器),除非人为停止或程序崩溃
接下来请看
这是服务要处理的耗时操作,每秒数据加一
这是服务
这是主程序
这是效果图
服务一旦运行,程序退出是不会被销毁的(最好的例子就是播放器),除非人为停止或程序崩溃
接下来请看
这是服务要处理的耗时操作,每秒数据加一
package com.example.serverthread; import android.util.Log; public class MyThread extends Thread{ public static int i = 0; //线程开关 boolean flag; //留出一个控制线程开启的接口 public void setStart(){ flag = true; start();//启动线程 } //留出一个控制线程关闭的接口 public void setStop(){ flag = false; } @Override public void run() { //true就跑起线程 while(flag){ try { Thread.sleep(1000); i++; Log.i("log", "MyThread if running ---->" + i); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
这是服务
package com.example.serverthread; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MyServer extends Service { @Override public IBinder onBind(Intent intent) { Log.i("log", "---onBind---->"); return null; } /** * 当服务一旦开启,只执行一次方法onCreate, 除非应用程序被强制干掉 */ @Override public void onCreate() { Log.i("log", "---onCreate---->"); super.onCreate(); } MyThread mThread; @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("log", "---onStartCommand---->"); /** * 服务运行在主线程,不能进行耗时操,所以开启线程处理数据 当程序退出时,服务没有关闭的情况下,这里的东西都没有被销毁 * 当程序再次进来时,我们依然能够找到上次开辟的线程 */ String action = intent.getStringExtra("action"); Log.i("log", action); if (action.equals("start")) { // 如果不为空,创建线程 if (mThread == null) { mThread = new MyThread(); mThread.setStart(); Toast.makeText(getApplicationContext(), "服务开启", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "服务下的线程已经开启", Toast.LENGTH_LONG).show(); } } else if (action.equals("stop")){ // 如果不为空,销毁线程 if (mThread != null) { mThread.setStop(); mThread = null; //服务自己关闭服务 stopSelf(); Toast.makeText(getApplicationContext(), "服务关闭", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "服务下的线程已经销毁", Toast.LENGTH_LONG).show(); } } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i("log", "---onDestroy---->"); super.onDestroy(); } }
这是主程序
package com.example.serverthread; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { TextView mTv; Button mStart, mEnd; Intent myServer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv = (TextView) findViewById(R.id.main_text); mStart = (Button) findViewById(R.id.main_bt_start); mEnd = (Button) findViewById(R.id.main_bt_end); myServer = new Intent(MainActivity.this, MyServer.class); mStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 给服务发送消息,控制线程的开启与关闭 myServer.putExtra("action", "start"); // 开启服务 startService(myServer); } }); mEnd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 给服务发送消息,控制线程的开启与关闭 myServer.putExtra("action", "stop"); // 关闭服务 startService(myServer); } }); } }
这是效果图
相关文章推荐
- Android ProgressBar自定义图片进度,自定义渐变色进度条
- Android文本输入框EditText属性和方法说明
- Android-Universal-Image-Loader学习笔记(一)
- Android实现将Drawable资源ID存储到Sdcard上
- [Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
- Android0828<十>(自定义的AlertDialog,Popup Window,Notification)
- Android在线切换主题(换肤),支持直接替换整个布局
- android java.lang.IllegalStateException异常产生的原因及解决办法 Offending field: mSpans
- android再按一次退出程序提示
- android开发网文搜集
- 关于android 自定义TitleBar 会遇到的问题
- 【Android】Fragment真正意义上的onResume和onPause
- Android5.1 Telephony流程分析——拨打电话流程(MO CALL)
- Android DownloadManager 的使用及断点续传
- Android:透明状态栏的效果实现
- Android开发个人
- Android viewPager.setOnPageChangeListener()方法过时怎么办
- Android的XML解析
- 在android studio中,使用getAssets获取文件的问题
- android开发SQLite之getReadableDatabase() 和 getWritableDatabase()方法