Android服务的基本使用1(启动服务)

来源:互联网 发布:软件测试个人心得 编辑:程序博客网 时间:2024/06/04 01:24

我有一时,曾经屡次忆起儿时在故乡所吃的蔬菜:菱角、罗汉豆、茭白、香瓜。凡这些,都是极其鲜美可口的;都曾是使我思乡的蛊惑。后来,我在久别之后尝到了,也不过如此;惟独在记忆上,还有旧来的意味存留。他们也许要哄骗我一生,使我时时反顾。

                            鲁迅《朝花夕拾》

在布局中简单的写两个按钮

<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的时候要写一个无参调用父类有参的构造函数,要不然会报错

1 0