现在的位置: 首页 > 综合 > 正文

Android点滴(一)

2014年09月05日 ⁄ 综合 ⁄ 共 2684字 ⁄ 字号 评论关闭

如何在一个apk中调用另外一个apk中的activity?
   系统提供了很多可以直接调用的Activity,通过指定的Intent就可以调用,比如打开搜索的:

Java代码  收藏代码
  1. Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);  
  2. intent.putExtra(SearchManager.QUERY,"searchString")  
  3. startActivity(intent);
     

     Intent.ACTION_WEB_SEARCH是一个字符串,是“搜索”这个Activity的标识,extra是传给这个activity的一些数据。发送出这个intent之后,系统根据action字符串Intent.ACTION_WEB_SEARCH知道了是要调用哪个activity,如果有重名,会弹出一个选择对话框。然后打开此activity,实现想要做的事情。
    那么,我们自己怎么来实现呢。
    首先,写一个activity,在AndroidManifest.xml里面的intent-filter中,给这个activity命名,

Xml代码  收藏代码
  1. <intent-filter>  
  2.         <action android:name="chroya.foo"/>  
  3.         <category android:name="android.intent.category.DEFAULT"/>  
  4. </intent-filter>  

    然后安装。安装完毕之后,你会发现,系统中找不到这个程序。别急,它确实安装在手机里面了,但是因为他不是main的,所以系统不会把他当做Application的入口程序。
    而要想打开这个activity,只有知道它名字的人才可以。跟系统的intent一样使用。它的名字定义为"chroya.foo",所以,这里用这个字符串就可以调用它了:

Java代码  收藏代码
  1. Intent intent = new Intent("chroya.foo");  
  2. 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了。

Java代码  收藏代码
  1. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);  
  2. ComponentName cn = am.getRunningTasks(1).get(0).topActivity;  
  3. Log.d("""pkg:"+cn.getPackageName());  
  4. Log.d("""cls:"+cn.getClassName());
      

       至于这个能做什么,嘿嘿,我相信你知道的。

如何判断一个activity是否存在于系统中?
已知包名和类名,如何判断这个activity是否在系统中存在呢?很简单,通过intent就行。

Java代码  收藏代码
  1. Intent intent = new Intent();  
  2. intent.setClassName("包名""类名");        
  3. if(getPackageManager().resolveActivity(intent, 0) == null) {  
  4.     //说明系统中不存在这个activity  
  5. }
     

如何让应用程序动态全屏和退出全屏?
    让程序全屏的方法,大家都知道,那是静态的,程序运行之初就申明了。但是如果有这样的需求:要在程序运行的过程中,执行了某个操作而使之全屏,然后还需要退出全屏,怎么做?
    如下:

Java代码  收藏代码
  1. WindowManager.LayoutParams attrs = getWindow().getAttributes();  
  2. attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;  
  3. getWindow().setAttributes(attrs);  
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
     

    修改window的LayoutParams参数,然后加上FLAG_LAYOUT_NO_LIMITS标志,就OK了。window会自动重新布局,呈现全屏的状态。
    要退出全屏,只需要清除刚才加上的FLAG_FULLSCREEN参数,然后去掉FLAG_LAYOUT_NO_LIMITS标志。
    如下:

Java代码  收藏代码
  1. WindowManager.LayoutParams attrs = getWindow().getAttributes();  
  2. attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  3. getWindow().setAttributes(attrs);  
  4. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
     

抱歉!评论已关闭.