Android Service简介(系列1)
Android Service是Android重要的组件,在
Android Service简介(系列1)
Android Service是Android重要的组件,在开发中会有用到和涉及。本文先给出一个最简单的Android Service例子。
(第1步)写一个类继承自Service,假设这个类的名字叫做MyAppService.java,重点是完成两个方法:
Service的onCreate和onStartCommand方法。
onCreate仅仅在Service第一次被startService时候初始化操作一次,随后不管再怎么startService,都不会再onCreate了。
耗时的、后台的、不需要用户交互的操作放在onStartCommand里面处理。需要强调一点,Android的Service并不是一个单独的进程、线程空间,是和Android主线程共享进程空间,这就意味,不要在onStartCommand方法里面阻塞主线程,否则将造成ANR!如果在onStartCommand里面有耗时操作,那么务必将onStartCommand里面的耗时操作代码块放到线程里面做。(注意!次说仅仅针对Service,IntentService和Service机制不同,不存在此问题,但有其自身特点,后面文章再说。)
Service的onDestroy只会被调用一次,那就是Service被stopService或者stopSelf时候。
此例用Service实现一个加法
1.定义一个Key供调用
package com.example.service; public class Constans { public static final String KEY="my_key"; }2.发送端
package com.example.service; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener{ EditText et1=null; EditText et2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et1=(EditText) findViewById(R.id.et1); et2=(EditText) findViewById(R.id.et2); Button button1=(Button) findViewById(R.id.button1); button1.setOnClickListener(this); } @Override public void onClick(View v) { int[] data=new int[2]; data[0]=Integer.parseInt(et1.getText().toString()); data[1]=Integer.parseInt(et2.getText().toString()); Intent intent=new Intent(MainActivity.this,MyAppservice.class); intent.putExtra(Constans.KEY, data); startService(intent); } public void onDestroy(){ super.onDestroy(); Intent intent=new Intent(MainActivity.this,MyAppservice.class); stopService(intent); }
3.接收端
package com.example.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MyAppservice extends Service{ @Override public void onCreate(){ } @Override public int onStartCommand(Intent intent, int flags, int startId) { int[] data=intent.getIntArrayExtra(Constans.KEY); int num=data[0]+data[1]; Toast.makeText(this, num+"", 0).show(); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } public void onDestroy(){ super.onDestroy(); Log.d("没问题", "就是他"); } }
onCreate仅仅在Sepackage com.example.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MyAppservice extends Service{
@Override
public void onCreate(){
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int[] data=intent.getIntArrayExtra(Constans.KEY);
int num=data[0]+data[1];
Toast.makeText(this, num+"", 0).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onDestroy(){
super.onDestroy();
Log.d("没问题", "就是他");
}
}rvice第一次被startService时候初始化操作一次,随后不管再怎么startService,都不会再onCreate了。
耗时的、后台的、不需要用户交互的操作放在onStartCommand里面处理。需要强调一点,Android的Service并不是一个单独的进程、线程空间,是和Android主线程共享进程空间,这就意味,不要在onStartCommand方法里面阻塞主线程,否则将造成ANR!如果在onStartCommand里面有耗时操作,那么务必将onStartCommand里面的耗时操作代码块放到线程里面做。(注意!次说仅仅针对Service,IntentService和Service机制不同,不存在此问题,但有其自身特点,后面文章再说。)
Service的onDestroy只会被调用一次,那就是Service被stopService或者stopSelf时候。