當前位置:首頁 » 安卓系統 » androidservice銷毀

androidservice銷毀

發布時間: 2023-06-19 13:39:26

❶ android service 什麼情況下會被系統回收

android service 開機啟動後被被自動關閉掉原因:
Android 系統對於內存管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控製程序的內存使用。當系統覺得當前的資源非常有限的時候,為了保 證一些優先順序高的程序能運行,就會殺掉一些他認為不重要的程序或者服務來釋放內存。這樣就能保證真正對用戶有用的程序仍然再運行。如果你的 Service 碰上了這種情況,多半會先被殺掉。但如果你增加 Service 的優先順序就能讓他多留一會,我們可以用 setForeground(true) 來設置 Service 的優先順序。
默認啟動的 Service 是被標記為 background,當前運行的 Activity 一般被標記為 foreground,也就是說你給 Service 設置了 foreground 那麼他就和正在運行的 Activity 類似優先順序得到了一定的提高。當讓這並不能保證你得 Service 永遠不被殺掉,只是提高了他的優先順序。

❷ android:當Activity和Service 都被銷毀後,如何控制其中生成的線程

線程沒有被銷毀的,當Activity或者Service中還有活動線程的時候,垃圾回收器是不會回收銷毀Activity和Service對象的。舉個例子,你可以在Activity中啟動一個線程,在onDestroy中用System.out.print或者log輸出一個信息,然後通過按鈕調用finish方法,會發現點擊以後Activity會「關閉」,但只是不可見了,但是沒有調用onDestroy方法。除非你在onDestroy中關閉了線程才會關閉。
線程管理一般是通過一個布爾類型值保存其狀態,通過判斷它是否為空,一起來處理。這樣最簡單。
就是在onDestroy中處理的,你說沒有調用,是因為還有子線程在運行。在onDestroy中判斷線程狀態,正常關閉線程以後就行了。

❸ Android中 Service的結束

確實是殺死App進程,同時App所有的棧內activity都會退棧,沒有Finish的activity都會執行onDestroy(),所以onDestroy()里的代碼能夠執行

❹ android中啟動service的activity銷毀了,這時怎麼關閉service

droid中怎麼啟動關閉Service及功能解釋 .
7.16,杭州。阿里百川無線開放大會。阿里與開發者一起見證移動的力量
什麼是Service?
解惑:
1、 Service不是分離開的進程,除非其他特殊情況,它不會運行在自己的進程,而是作為啟動運行它的進程的一部分。
2、 Service不是線程,這意味著它將在主線程里勞作。
啟動service有兩種方法:
1、 Context.startService()
調用者與服務之間沒有關聯,即使調用者退出,服務仍可運行
2、 Context.bindService()
調用者與服務綁定在一起,調用者一旦退出,服務也就終止
Service的生命周期
如果使用startService()啟動service,系統將通過傳入的Intent在底層搜索相關符合Intent裡面信息的service。如果服務沒有啟動則先運行onCreate,然後運行onStartCommand (可在裡面處理啟動時傳過來的Intent和其他參數),直到明顯調用stopService或者stopSelf才將停止Service。無論運行startService多少次,只要調用一次stopService或者stopSelf,Service都會停止。使用stopSelf(int)方法可以保證在處理好intent後再停止。
控制service運行的主要方式有兩種,主要是根據onStartCommand方法返回的數值。方法:
1、START_STICKY
2、START_NOT_STICKY or START_REDELIVER_INTENT
這里主要解釋這三個變數的意義:
1、 START_STICKY
在運行onStartCommand後service進程被kill後,那將保留在開始狀態,但是不保留那些傳入的intent。不久後service就會再次嘗試重新創建,因為保留在開始狀態,在創建 service後將保證調用onstartCommand。如果沒有傳遞任何開始命令給service,那將獲取到null的intent
2、 START_NOT_STICKY
在運行onStartCommand後service進程被kill後,並且沒有新的intent傳遞給它。Service將移出開始狀態,並且直到新的明顯的方法(startService)調用才重新創建。因為如果沒有傳遞任何未決定的intent那麼service是不會啟動,也就是期間onstartCommand不會接收到任何null的intent。
3、 START_REDELIVER_INTENT
在運行onStartCommand後service進程被kill後,系統將會再次啟動service,並傳入最後一個intent給onstartCommand。直到調用stopSelf(int)才停止傳遞intent。如果在被kill後還有未處理好的intent,那被kill後服務還是會自動啟動。因此onstartCommand不會接收到任何null的intent。
客戶端也可以使用bindService來保持跟service持久關聯。謹記:如果使用這種方法,那麼將不會調用onstartCommand(跟startService不一樣,下面例子注釋也有解析,大家可試試)。客戶端將會在onBind回調中接收到IBinder介面返回的對象。通常IBinder作為一個復雜的介面通常是返回aidl數據。
Service也可以混合start和bind一起使用。
許可權
要運行service,首先必須在AndroidManifest.xml里申明<service>標簽。
Service能夠保護個人的IPC調用,所以在執行實現該調用時前先使用checkCallingPermission(String) 方法檢查是否有這個許可權。

進程生命周期
當service運行在低內存的環境時,將會kill掉一下存在的進程。因此進程的優先順序將會很重要:
1、 如果service當前正在執行onCreate、onStartCommand、onDestroy方法,主進程將會成為前台進程來保證代碼可以執行完成避免被kill
2、 如果service已經啟動了,那麼主進程將會比其他可見的進程的重要性低,但比其他看不見的進程高。因為只有少部分進程始終是用戶可見的,因此除非在極度低內存的時候,不然 service是不會被kill的。
3、 如果有客戶端關聯到service,那麼service永遠比客戶端重要。也就是說客戶端可見,那麼service也可見(我理解這里的可見並不是可以看到,而是重要性,因為可見往往就表示重要性高)。
4、 Service可以使用startForeground API將service放到前台狀態。這樣在低內存時被kill的幾率更低,但是文檔後面又寫了,如果在極度極度低內存的壓力下,該service理論上還是會被kill掉。但這個情況基本不用考慮。
當然如果service怎麼保持還是被kill了,那你可以通過重寫onStartCommand返回變數來設置它的啟動方式。比如:START_STICKY、START_REDELIVER_INTENT等等,前面已經討論了它們的作用,這里就不再累贅了
另外:
service 的onCreate和onStartCommand 是運行在主線程的,所以如果裡面有處理耗時間的任務。兩種處理:
1、 請將它們都挪到新的線程里。
2、 用系統提供的IntentService,它繼承了Service,它處理數據是用自身新開的線程。

啟動關閉service實例

===================main文件========================
package com.services.coms;
import java.io.FileFilter;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainService extends Activity {
private TextView textviewService;
private Button buttonStart ,buttonStop;
public static final int CMD_STOP_SERVICE = 0;
DataReceiver dateReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textviewService=(TextView)findViewById(R.id.textservice);
buttonStart=(Button)findViewById(R.id.buttonstart);
buttonStop=(Button)findViewById(R.id.buttonstop);
buttonStart.setOnClickListener(buttonClick);
buttonStop.setOnClickListener(buttonClick);
}

private View.OnClickListener buttonClick =new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v==buttonStart){
Intent intentService=new Intent(MainService.this,MyService.class);
startService(intentService);
Log.i("onStartCommand", "OnClickListener=");
}else if(v==buttonStop){
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("cmd",CMD_STOP_SERVICE);
sendBroadcast(intent);
}

}
};
private class DataReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Log.i("onStartCommand", "接受要更新的廣播數據="+intent.getStringExtra("data"));
String Date=intent.getStringExtra("data");
textviewService.setText(Html.fromHtml("<font color='#0066CC'><u>"+"Service的數據為:"+Date+"</font>"));
}
}
@Override
protected void onStart() {
dateReceiver=new DataReceiver();
IntentFilter intentfilter=new IntentFilter();// 創建IntentFilter對象
intentfilter.addAction("AAAAA");
registerReceiver(dateReceiver, intentfilter);// 注冊Broadcast Receiver
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(dateReceiver);// 取消注冊Broadcast Receiver
super.onStop();
}

}
===================service文件===================
package com.services.coms;
import java.util.UUID;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
CommandReceiver cmdReceiver;
boolean flag;

@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
@Override
public void onCreate() {
cmdReceiver=new CommandReceiver();
flag=true;
Log.i("onStartCommand", "onCreate=");
super.onCreate();
}
@Override
public void onDestroy() {
this.unregisterReceiver(cmdReceiver);// 取消BroadcastReceiver
super.onDestroy();
}
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
}
@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand", "onStartCommand=");
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("AAAAA");
registerReceiver(cmdReceiver, intentFilter);
doJob();// 調用方法啟動線程

return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//接受廣播
private class CommandReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int cmd=intent.getIntExtra("cmd", -1);
if(cmd==MainService.CMD_STOP_SERVICE){//如果等於0
flag=false;//停止線程
stopSelf();//停止服務
}
}

}
public void doJob(){
new Thread(){
@Override
public void run() {
while(flag){//如果==true執行發送廣播
try {
Thread.sleep(1000);//休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("onStartCommand", "run=");
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("data",UUID.randomUUID()+"");
sendBroadcast(intent);//發送廣播名稱aaaaa 參數名字data

}
}
}.start();
}
}

==================layout文件=====================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textservice"
></TextView>
<Button
android:id="@+id/buttonstart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="啟動服務"
android:gravity="center"
></Button>
<Button
android:id="@+id/buttonstop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止服務"
android:gravity="center"
></Button>
</LinearLayout>

原文鏈接:http://blog.csdn.net/centralperk/article/details/7764379

熱點內容
流控腳本破解 發布:2025-02-07 08:39:09 瀏覽:413
什麼是資源為什麼要研究資源配置 發布:2025-02-07 08:25:19 瀏覽:87
釣魚網站源碼製作 發布:2025-02-07 08:23:54 瀏覽:139
mac運行fl需要什麼配置 發布:2025-02-07 08:15:45 瀏覽:573
安卓怎麼做都比不了蘋果 發布:2025-02-07 08:12:47 瀏覽:238
怎麼給物理機配置ip地址 發布:2025-02-07 08:01:37 瀏覽:139
三國志13未加密 發布:2025-02-07 07:54:37 瀏覽:926
馬斯克中國訪問 發布:2025-02-07 07:54:29 瀏覽:102
資料庫有表 發布:2025-02-07 07:50:49 瀏覽:29
基於nginx搭建圖片伺服器原理 發布:2025-02-07 07:44:18 瀏覽:449