Android中可以使用 ActivityManager来获得正在运行或者已经启动的程序,示例如下:
// 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名// 这儿我直接获取了系统里安装的所有应用程序,然后根据报名pkgname过滤获取所有真正运行的应用程序
private List<RunningAppInfo> queryAllRunningAppInfo() {
pm = this.getPackageManager()
// 查询所有已经安装的应用程序
List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES)
Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm))// 排序
// 保存所有正在运行的包名 以及它所在的进程信息
Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>()
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
.getRunningAppProcesses()
for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {
int pid = appProcess.pid // pid
String processName = appProcess.processName // 进程名
Log.i(TAG, "processName: " + processName + " pid: " + pid)
String[] pkgNameList = appProcess.pkgList // 获得运行在该进程里的所有应用程序包
// 输出所有应用程序的包名
for (int i = 0 i < pkgNameList.length i++) {
String pkgName = pkgNameList[i]
Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid)
// 加入至map对象里
pgkProcessAppMap.put(pkgName, appProcess)
}
}
// 保存所有正在运行的应用程序信息
List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>() // 保存过滤查到的AppInfo
for (ApplicationInfo app : listAppcations) {
// 如果该包名存在 则构造一个RunningAppInfo对象
if (pgkProcessAppMap.containsKey(app.packageName)) {
// 获得该packageName的 pid 和 processName
int pid = pgkProcessAppMap.get(app.packageName).pid
String processName = pgkProcessAppMap.get(app.packageName).processName
runningAppInfos.add(getAppInfo(app, pid, processName))
}
}
return runningAppInfos
}
一、通过ActivityManager.RunningAppProcessInfo判断
首先,我们需要写一个BaseActivity,然后让我们应用程序的Activity都继承自BaseActivity,这样就可以统一管理,然后在BaseActivity的onResume()和onStop()方法中进行判断应用程序是否进入到后台并且是否从后台返回到了前台,直接看代码:
public class BaseActivity extends Activity {public static boolean isActive //全局变量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_base)
}
@Override
protected void onResume() {
if (!isActive) {
//app 从后台唤醒,进入前台
isActive = true
Log.i("ACTIVITY", "程序从后台唤醒")
}
super.onResume()
}
@Override
protected void onStart() {
super.onStart()
}
@Override
protected void onPause() {
super.onPause()
}
@Override
protected void onStop() {
if (!isAppOnForeground()) {
//app 进入后台
isActive = false//记录当前已经进入后台
Log.i("ACTIVITY", "程序进入后台")
}
super.onStop()
}
@Override
protected void onDestroy() {
super.onDestroy()
}
/**
* APP是否处于前台唤醒状态
*
* @return
*/
public boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)
String packageName = getApplicationContext().getPackageName()
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses()
if (appProcesses == null)
return false
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
// The name of the process that this object is associated with.
if (appProcess.processName.equals(packageName)
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true
}
}
return false
}
}
Android中网络情况时有变化,比如从有网到没网,从wifi到gprs,gprs又从cmwap到cmnet...等等!如果你的程序有些功能是需要网络支持的,有时候就需要监听到网络的变化情况进行相应的处理。
比如说下载一个文件,如果突然断网了,怎么处理?网络又恢复了,如何监听到并重连?
当网络变化的时候系统会发出义个广播broadcast,只要在程序中注册一个广播接收器BroadcastReceiver,并在IntentFilter中添加相应的过滤,这样一旦网络有变化,程序就能监听到
public
static
final
String
CONNECTIVITY_CHANGE_ACTION
=
"android.net.conn.CONNECTIVITY_CHANGE"
private
void
registerDateTransReceiver()
{
Log.i(TAG,
"register
receiver
"
+
CONNECTIVITY_CHANGE_ACTION)
IntentFilter
filter
=
new
IntentFilter()
filter.addAction(CONNECTIVITY_CHANGE_ACTION)
filter.setPriority(1000)
registerReceiver(new
MyReceiver(),
filter)
}
在MyReceiver中:
@Override
public
void
onReceive(Context
context,
Intent
intent)
{
String
action
=
intent.getAction()
Log.i(TAG,
"PfDataTransReceiver
receive
action
"
+
action)
if(TextUtils.equals(action,
CONNECTIVITY_CHANGE_ACTION)){//网络变化的时候会发送通知
Log.i(TAG,
"网络变化了")
return
}
}
当网络变化时,从有网到没网也会发广播,就举的例子来说,如果下载时断网了,接收到广播的时候要判断当前网络是可用还是不可用状态,如果可用进行什么 *** 作;不可用进行什么 *** 作:
public
static
NetworkInfo
getActiveNetwork(Context
context){
if
(context
==
null)
return
null
ConnectivityManager
mConnMgr
=
(ConnectivityManager)
context
.getSystemService(Context.CONNECTIVITY_SERVICE)
if
(mConnMgr
==
null)
return
null
NetworkInfo
aActiveInfo
=
mConnMgr.getActiveNetworkInfo()
//
获取活动网络连接信息
return
aActiveInfo
}
这个方法返回的aActiveInfo可以判断网络的有无,如果返回的是null,这时候是断网了,如果返回对象不为空,则是连上了网。在返回的NetworkInfo对象里,可以有对象的方法获取更多的当前网络信息,比如是wifi还是cmwap等,就不多说了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)