如何在一个apk中调用另外一个apk中的activity?
系统提供了很多可以直接调用的Activity,通过指定的Intent就可以调用,比如打开搜索的:
- Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
- intent.putExtra(SearchManager.QUERY,"searchString")
-
startActivity(intent);
Intent.ACTION_WEB_SEARCH是一个字符串,是“搜索”这个Activity的标识,extra是传给这个activity的一些数据。发送出这个intent之后,系统根据action字符串Intent.ACTION_WEB_SEARCH知道了是要调用哪个activity,如果有重名,会弹出一个选择对话框。然后打开此activity,实现想要做的事情。
那么,我们自己怎么来实现呢。
首先,写一个activity,在AndroidManifest.xml里面的intent-filter中,给这个activity命名,
- <intent-filter>
- <action android:name="chroya.foo"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
然后安装。安装完毕之后,你会发现,系统中找不到这个程序。别急,它确实安装在手机里面了,但是因为他不是main的,所以系统不会把他当做Application的入口程序。
而要想打开这个activity,只有知道它名字的人才可以。跟系统的intent一样使用。它的名字定义为"chroya.foo",所以,这里用这个字符串就可以调用它了:
- Intent intent = new Intent("chroya.foo");
-
startActivity(intent);
用刚才举的那个系统的intent说明,它的activity里面使用getIntent().getBundleExtra(SearchManager.QUERY)来接收传递进来的搜索字符串参数。而这个SearchManager.QUERY是关键字。如果要自己实现这种功能,只需要定义好关键字,然后从BundleExtra中取就行了。
如何获取屏幕上正显示的activity?
用过ActivityManager的童鞋估计都知道,可以从ActivityManager里面可以获取到当前运行的所有任务,所有进程和所有服务,这是任务管理器的核心。
那么,从里面我们可以发掘点什么出来吗?
仔细看getRunningTasks的文档,里面说获取的是系统中"running"的所有task,"running"状态包括已经被系统冻结的task。而且返回的这个列表是按照顺序排列的,也就是说第一个肯定比第二个后运行。
getRunningTasks有个整型参数,表示返回列表的最大个数。那么,我们如果把1作为参数给进去,那么他返回的task就是当前运行的那个task,然后从task中获取到最顶层的activity,这个activity就是当前显示给用户的那个activity了。
- ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
- Log.d("", "pkg:"+cn.getPackageName());
-
Log.d("", "cls:"+cn.getClassName());
至于这个能做什么,嘿嘿,我相信你知道的。
如何判断一个activity是否存在于系统中?
已知包名和类名,如何判断这个activity是否在系统中存在呢?很简单,通过intent就行。
- Intent intent = new Intent();
- intent.setClassName("包名", "类名");
- if(getPackageManager().resolveActivity(intent, 0) == null) {
- //说明系统中不存在这个activity
-
}
如何让应用程序动态全屏和退出全屏?
让程序全屏的方法,大家都知道,那是静态的,程序运行之初就申明了。但是如果有这样的需求:要在程序运行的过程中,执行了某个操作而使之全屏,然后还需要退出全屏,怎么做?
如下:
- WindowManager.LayoutParams attrs = getWindow().getAttributes();
- attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
- getWindow().setAttributes(attrs);
-
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
修改window的LayoutParams参数,然后加上FLAG_LAYOUT_NO_LIMITS标志,就OK了。window会自动重新布局,呈现全屏的状态。
要退出全屏,只需要清除刚才加上的FLAG_FULLSCREEN参数,然后去掉FLAG_LAYOUT_NO_LIMITS标志。
如下:
- WindowManager.LayoutParams attrs = getWindow().getAttributes();
- attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
- getWindow().setAttributes(attrs);
-
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);