使用前臺服務
阿新 • • 發佈:2018-11-25
服務幾乎都是在後臺執行的,移植依賴它都是默默的做著辛苦的工作,但是服務的優先順序還是比較低的,當系統出現記憶體不足的情況時,就有可能會回收掉正在後天執行的服務。如果你希望服務可以一直保持執行狀態,而不會由於記憶體不足的原因導致被回收,就可以考慮使用前臺服務。前臺服務和普通服務的最大區別就在於,它會一直有一個正在執行的圖示在系統的狀態列顯示,下拉狀態列後可以看到更加詳細的資訊,非常類似於通知燈額效果。當然有時候你也可能不僅僅是為了防止服務被回收掉才使用前臺服務的,有些專案由於特殊的需求會要求必須使用前臺服務,比如說彩雲天氣這款天氣預報應用,它額的服務在後臺更新天氣資料的同時,還會在系統的狀態列一直顯示當前的天氣資訊。
一、修改activity_main.xml檔案
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/start_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Start Service"/> <Button android:id="@+id/stop_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop Service"/> <Button android:id="@+id/bind_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Bind Service"/> <Button android:id="@+id/unbind_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Unbind Service"/> </LinearLayout>
二、修改MainActivity檔案
package com.example.yxp.service; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import java.sql.BatchUpdateException; public class MainActivity extends Activity { private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } @Override public void onServiceDisconnected(ComponentName componentName) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button startService = (Button) findViewById(R.id.start_service); Button stopService = (Button) findViewById(R.id.stop_service); startService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent startIntent = new Intent(MainActivity.this,MyService.class); startService(startIntent); } }); stopService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent stopIntent = new Intent(MainActivity.this,MyService.class); stopService(stopIntent); } }); final Button bindService = (Button) findViewById(R.id.bind_service); final Button unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent bindIntent = new Intent(MainActivity.this,MyService.class); bindService(bindIntent,connection,BIND_AUTO_CREATE); } }); unbindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { unbindService(connection); } }); } }
三、修改MyService檔案
package com.example.yxp.service;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder {
public void startDownload(){
Log.d("MyService","startDownload executed");
}
public int getProgress(){
Log.d("MyService","getProgress executed");
return 0;
}
}
public IBinder onBind(Intent intent){
return mBinder;
}
public MyService() {
}
public void onCreate(){
super.onCreate();
Log.d("MyService","onCreate executed");
Intent intent = new Intent(this,MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new Notification.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
startForeground(1,notification);
}
public int onStartCommand(Intent intent,int flags,int startId){
Log.d("MyService","onStartCommand executed");
return super.onStartCommand(intent,flags,startId);
}
public void onDestroy(){
super.onDestroy();
Log.d("MyService", "onDestroy executed");
}
}
四、效果
`···································