服務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>