我有一时,曾经屡次忆起儿时在故乡所吃的蔬菜:菱角、罗汉豆、茭白、香瓜。凡这些,都是极其鲜美可口的;都曾是使我思乡的蛊惑。后来,我在久别之后尝到了,也不过如此;惟独在记忆上,还有旧来的意味存留。他们也许要哄骗我一生,使我时时反顾。
鲁迅《朝花夕拾》
在布局中简单的写两个按钮
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:onClick="start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:onClick="stop"
/>
MainActivity
public class MainActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, MyServices.class);
}
public void start(View view) {
intent.putExtra("data", "下载的路径");
startService(intent);
}
public void stop(View view) {
stopService(intent);
}
}
MyServices.java
public class MyServices extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("test", "onBind");
return null;
}
//创建服务
@Override
public void onCreate() {
Log.i("test", "onCreate");
super.onCreate();
}
//启动服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String data= intent.getStringExtra("data");
Log.i("test", "onStartCommand,"+data);
new MyThread(startId).start();
return super.onStartCommand(intent, flags, startId);
}
class MyThread extends Thread {
private int startId;
public MyThread(int startId) {
this.startId = startId;
}
@Override
public void run() {
super.run();
//耗时操作
for (int i = 0; i < 10; i++) {
Log.i("test", "i=" + i);
SystemClock.sleep(1000);
}
//停止服务
// stopSelf();//当第一个线程执行完毕,则会停止服务
//当所有线程执行完毕,则会停止服务
stopSelf(startId);
}
}
//停止服务
@Override
public void onDestroy() {
Log.i("test", "onDestroy");
super.onDestroy();
}
}
**在启动服务中要注意的是 :
ANR:application not responsing应用程序未响应
why:耗时操作写到了主线程
how:子线程
why:服务和Thread的区别?
服务:死了可以活过来
线程:死了就是死了
QQ的接收消息:两三天没登,消息还是可以接收**
MyServices2.Java
public class MyServices2 extends IntentService {
//无参调用父类有参
public MyServices2() {
super("");
}
public MyServices2(String name) {
super(name);
}
//类似Service中的:onStartCommand
/*
*区别:1.在于可以直接进行耗时操作
* 2.排队进行服务
*/
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i < 10; i++) {
Log.i("test", "i=" + i);
SystemClock.sleep(200);
}
}
}
清单文件的配置
<service android:name=".MyServices"
android:exported="true"
>service>
<service android:name=".MyServices2"
android:exported="true"
>service>
在配置MyServices2的时候要写一个无参调用父类有参的构造函数,要不然会报错