Android关闭service

我在检测的时候开启了一个service,直接stop的时候怎么不行
2025-05-21 14:28:25
推荐回答(2个)
回答1:

stopService(new Intent(当前Activity.this, 后台Service.class));
这个是可以的啊

回答2:

方法一:

public class mService extends Service {
//
保存在
service
中的
Activity
对象

private static mActivity m;
//
启动服务

static void startservice(Context c){

m=(mActivity)c;

Intent iService=new Intent(c,mService.class);

iService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

c.startService(iService);

}
//
关闭服务

static void stopservice(Context c){

Intent iService=new Intent(c,mService.class);

iService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

c.stopService(iService);

}

……

//

mService
中关闭
mActivity
m.finish();
}

public class mActivity extends Activity {

// private MediaPlayer mMPlayer;

/*

* (non-Javadoc)

* @see android.app.Activity#onCreate(android.os.Bundle)

*/

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

……

//
启动
mService
mService.startservice(mActivity.this);

……

//
停止
mService
mService.stopservice(mActivity.this);

}
}

方法二:

主要包括
3
部分

1.
定义
application
类,这个类可以保存获取
activity
实例,记得
manifest
中加

android:name=".MyApp"
public class MyApp extends Application{

private MyServiceActivity myActivity;

public void setInstance(MyServiceActivity instance){

myActivity = instance;

}

public MyServiceActivity getInstance(){

return myActivity;

}
}
2.

activity
中保存实例

public class MyServiceActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

((MyApp)getApplication()).setInstance(this);

……

}
}
3.

service
中取回实例

public class MyService extends Service {

MyServiceActivity myActivity;

@Override

public void onCreate() {

super.onCreate();

setForeground(true);

android.os.Debug.waitForDebugger();

myActivity = ((MyApp)getApplication()).getInstance();

……

}
}

我试过第一个方法,可行的。

但是当遇到
AIDL
的时候,
恐怕就不能用这两种方法关闭
Service
启动的
Activity
了。

我试过很多办法都是失败的,比如我把
Activity
赋值给一个静态的变量,不管怎
么传值,在
AIDL
调用的方法中该变量就是
Null


查看相关资料后,我的理解是
AIDL
不支持静态参数,也就说在
AIDL
中调用任
何静态参数都是
NULL


这也仅仅是我的理解,可能有错误!希望高手及时指正!



时我的需求是这样的,一个客户端要通过我的
AIDL
不断地发请求打开页面,
因此我需要在
Service
中开启一个线程,当有新的请求发过来的时候我打开页

面。
之前写的程序要么就是打开一个页面之后死活都不动了,
要么就是不停地开
启一个新的
Activity
,然后按
back
键要退掉很多的
Activity


而且关闭所有的
Activity
之后,
Service
打开的新
Activity
又是死活不变换了。

因此我需要
Service
打开新的页面的时候,把上一个
Activity finish
掉。尝试很
多方法无果之后,只能用广播了,我用
Service
发一个广播,然后
Activity
接受
到广播之后关闭。

但是这样又出来另外个问题,广播都是一个类继承
BroadcastReceive
,这个类
怎么去关闭
Activity
呢?

因此只能把广播写在
Acivity
中了。代码如下:

public class AnHTTPTool extends Activity {
private WebView mWebView;
private Context context;
private String mTrafficID;
private String mUrl;
private String mAPN;
private long mRas2Ftp;
private long mIntervalTime;
private int mTimes;
private AnHTTPTool aht;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

//
启动
mService

HTTPManagerService.startservice(AnHTTPTool.this);

super.onCreate(savedInstanceState);

setContentView(R.layout.browser);

aht = this;

mTrafficID = getIntent().getStringExtra("mTrafficID");
mUrl = getIntent().getStringExtra("mUrl");
mAPN = getIntent().getStringExtra("mAPN");
mRas2Ftp = getIntent().getLongExtra("mRas2Ftp", 0);
mIntervalTime = getIntent().getLongExtra("mIntervalTime", 0);
mTimes = getIntent().getIntExtra("mTimes", 1);
mWebView = (WebView) findViewById(R.id.WebView01);
mWebView.loadUrl(mUrl);

WebSettings mWebSettings = mWebView.getSettings();
MyWebViewClient mWebViewClient = new MyWebViewClient();

mWebView.setWebViewClient(mWebViewClient);
//
增加一个
Intent
过滤,添加
Receiver
监听
service
发送的广播

IntentFilter filter = new IntentFilter();

filter.addAction("Broadcast one!");

registerReceiver(mReceiver, filter);

}

protected BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();

if(action.equals("Broadcast one!")){

aht.finish();

//your code here

}

}
};
}

class MyWebViewClient extends WebViewClient {

//
网页开始加载

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
Log.d("H3c", "PageStarted");
super.onPageStarted(view, url, favicon);
}

//
网页结束加载

@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
Log.d("H3c", "PageFinished");
super.onPageFinished(view, url);
}

//

WebView
中打开新的网页

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;

}
}

这样在
Service
中用:

Intent i = new Intent("Broadcast one!");

//
发送广播

context.sendBroadcast(i);

就可以结束掉打开的
Activity
了!

在程序结束的时候记得注销广播:

unregisterReceiver(mReceiver);