android通过什么来监听应用程序的启动

android通过什么来监听应用程序的启动,第1张

  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等,就不多说了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11174449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存