您的位置:首页 > 移动开发 > Android开发

Service和IntentService

2015-09-09 21:54 459 查看
服务Service的含义

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android