stopService(new Intent(当前Activity.this, 后台Service.class));
这个是可以的啊
方法一:
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);