新手向大家请教几个问题

spider0029 2012-04-08 07:23:21
我先说一下我的目的:我的程序监听系统广播,如果发现网络发生改变,就把另一个程序先干掉,然后再重新启动它。这个程序的包名是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);
}
}
}

请问这个问题是出在哪里呢?

三、现在的问题就是怎样才能杀掉另一个程序和重新启动另一个程序。请高手指点一下关键所在。

谢谢!
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
old donkey 2014-03-20
  • 打赏
  • 举报
回复
加个context
紫凌峰 2014-03-20
  • 打赏
  • 举报
回复
楼主你这还叫新手呀,我是单词好像都见过,但是完全看不懂呀
spider0029 2012-04-19
  • 打赏
  • 举报
回复
多谢,没想到还有人回答我的问题。

我的程序是没有问题的,不管是在模拟器还是真机上都很正常。后来我试过,对于一个Activity,用startActivity和startService都可以正常让它运行起来,我也不知道为什么。懒得看SDK了。

我上面提问题中,杀进程的更是比较奇怪。程序看起来是没有错误,但实际上并未起作用,后来我发现了,必须要先列举所有进程,然后再杀其中的一个,就可以杀掉了。这玩意比较奇怪。
b87936260 2012-04-16
  • 打赏
  • 举报
回复
ntent localIntent3 = new Intent(context, MyprogramActivity.class);
context.startService(localIntent3);
MyprogramActivity是个Activity吧》为什么用启动service方法启动呢?


在上面的程序中,如果用localActivityManager的话,那么只要一执行,就发生致命错误,强制退出了。
如果用下面的ActivityManager mymanager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);那么eclipse提示错误,说:The method getSystemService(Object) is undefined for the type NetworkReceiver.java。

发生致命错误是因为am是空的吧?没有看到初始化的地方!其他没看出什么有可能出问题的地方。。。。

scott 2012-04-11
  • 打赏
  • 举报
回复
楼主不算新手啦
spider0029 2012-04-08
  • 打赏
  • 举报
回复
经过自己的探索,终于在Receiver里面成功调用自己了,用如下代码:
//如果监听到网络状态变化,则调用一次自己,主要功能在主程序中实现。
Intent i = new Intent(context, MyprogramActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

同时,在主程序中调用com.dragon.netguard也成功了,但用的办法和Receiver里面是不一样的:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.dragon.netguard","com.dragon.netguard.MainActivity"));
startActivity(intent);

现在还有两个问题需要解决,一个是怎么杀掉com.dragon.netguard,另一个就是在上面重启com.dragon.netguard的时候,怎么样才能让netguard不显示界面,直接在后台悄悄运行。

继续请教高手。。。

谢谢!

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧