20.1安卓的服務Service開啟關閉方法


服務Service從一定的角度來看,可以將其理解為沒有界面的Activity,

Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy

其中服務還分為兩種使用,

第一種是開啟關閉,第二種是綁定和解綁,

 

開啟服務(startService)

服務一旦開啟就與調用者沒有任何關系, 當調用者Activity退出時,服務仍在運行,不會影響后台service的運行。

在Activity中不能調用服務里面的方法

 

綁定服務(bindService)

通過綁定方式開啟服務,服務跟服務不求同生,但求同死。如果調用者的Activity退出了,那他綁定的服務也會跟着退出。

在Activity中能調用服務里面的方法

 

 

第一種,開始就執行oncreate,和onstart,結束時直接destroy,

而且調用者退出的時候這個服務不會退出,下次調用者再次上線時,依然可以關閉這個服務

就是說這個服務可以獨立生活

第一種現象是這樣

 

 

通過現象我們可以看出,運行的三種情況

1.這個服務從來都沒有使用過,執行的是創建和啟動兩步,

2.服務創建過,且沒有被銷毀,那么點擊開服務只能執行 “啟動” 一步,

3.當關閉了服務的時候,點擊開啟又開始了重新的創建和啟動

4.沒有了服務點擊關閉服務是哪個都不執行的

 

實現思路:新建一個Service,像我們新建Activity一樣新建,讓他繼承Service,

然后去mainfest中給他注冊一下。

package com.example.xialm.service_21tolog;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by xialm on 2019/11/7.
 */
public class MyOwnService extends Service {

    private int i1,i2,i3,i4;

    //只有創建的時候會被調用
    @Override
    public void onCreate() {

        i1++;
        Log.i("日志","我創建了第"+i1+"次");

    }

    //每次運行的時候都會被調用
    @Override
    public void onStart(Intent intent, int startId) {
        i2++;
        Log.i("日志","我運行了第"+i2+"次");

    }

    //每次關閉的時候都會被調用。
    @Override
    public void onDestroy() {
        i3++;
        Log.i("日志","我結束了第"+i3+"次");

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

 

mainactivity代碼

package com.example.xialm.service_21tolog;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button b_open;
    private Button b_close;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        b_open = (Button)findViewById(R.id.b_1);
        b_close = (Button)findViewById(R.id.b_2);

        b_open.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("fuwu1");
                //自安卓5.0以來就需要添加獲得包的名字,
                //兼容Android 5.0,5.0之后需要設置包名,
                // 這是為了防止造成沖突(有多個Service用同樣的intent-filter的情況),這里相對的是不同的包之間
                //注意是開始服務不是開始Activity
                intent.setPackage(getPackageName());
                startService(intent);
            }
        });

        b_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("fuwu1");
                intent.setPackage(getPackageName());
                //Log.i("當前包", getPackageName());
                stopService(intent);
            }
        });

    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.xialm.service_21tolog.MainActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/b_1"
        android:layout_below="@+id/tv1"
        android:text="開服務"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/b_2"
        android:layout_below="@+id/b_1"
        android:text="關服務"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM