新手向大家请教几个问题
我先说一下我的目的:我的程序监听系统广播,如果发现网络发生改变,就把另一个程序先干掉,然后再重新启动它。这个程序的包名是com.dragon.netguard。就这么简单的事情,刚刚接触,这几天先把eclipse搞好,然后写程序,但还是搞不定,特向大家请教。
一、监听系统广播
按照下面的程序,我已经实现了系统广播。这个没有问题。
AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.myprogram"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".MyprogramActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
<uses-permission android:name="android.permission.RESTART_PACKAGES"></uses-permission>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"></uses-permission>
</manifest>
NetworkReceiver.java文件:
package com.android.myprogram;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
Toast.makeText(context, "network changed!", 0).show();
//apn状态切换.
}
}
}
myprogramactivity.java文件:
package com.android.myprogram;
import android.app.Activity;
import android.app.ActivityManager;
import android.os.Bundle;
public class MyprogramActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
二、杀进程功能
在实现了上面监听功能后,我想在上面增加杀进程的功能,可是不管我用那个方法,都杀不掉,比如:
1、我先试图在myprogramactivity里面杀进程:
package com.android.myprogram;
import android.app.Activity;
import android.app.ActivityManager;
import android.os.Bundle;
public class MyprogramActivity extends Activity {
/** Called when the activity is first created. */
ActivityManager am = null;
或者private ActivityManager activityManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager localActivityManager = this.am;
localActivityManager.killBackgroundProcesses("com.dragon.netguard");
或者: localActivityManager.forceStopPackage("com.dragon.netguard");
又或者:localActivityManager.restartPackage("com.dragon.netguard");
又或者: ActivityManager mymanager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
mymanager.killBackgroundProcesses("com.dragon.netguard");
setContentView(R.layout.main);
}
}
上面的语句不管是在真机还是模拟器中,都没有提示错误,但就是com.dragon.netguard没有被杀掉。请问高手,还有哪个地方没有弄好?
2、上面的杀进程语句,是否可以放在NetworkReceiver里面?
我在NetworkReceiver.java里面试过:
package com.android.myprogram;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.app.ActivityManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
ActivityManager am = null;
或者 private ActivityManager activityManager;
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
Toast.makeText(context, "network changed!", 0).show();
}
ActivityManager localActivityManager = this.am;
localActivityManager.killBackgroundProcesses("com.dragon.netguard");
或者: localActivityManager.forceStopPackage("com.dragon.netguard");
又或者:localActivityManager.restartPackage("com.dragon.netguard");
又或者: ActivityManager mymanager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
mymanager.killBackgroundProcesses("com.dragon.netguard");
}
}
在上面的程序中,如果用localActivityManager的话,那么只要一执行,就发生致命错误,强制退出了。
如果用下面的ActivityManager mymanager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);那么eclipse提示错误,说:The method getSystemService(Object) is undefined for the type NetworkReceiver.java。
请问这问题又出在哪里呢?
3、我还试图在myprogramactivity里面直接杀掉,然后再在NetworkReceiver里面重新启动自己,虽然没有提出出错,但没有启动成功:
package com.android.myprogram;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
//import android.net.ConnectivityManager;
//import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
Toast.makeText(context, "network changed!", 0).show();
Intent localIntent3 = new Intent(context, MyprogramActivity.class);
context.startService(localIntent3);
}
}
}
请问这个问题是出在哪里呢?
三、现在的问题就是怎样才能杀掉另一个程序和重新启动另一个程序。请高手指点一下关键所在。
谢谢!