1.  

原本想搞一个退出程序时,把前一个应用程序的VIEW或者截图抓过来为我用,以实现更复杂的动画效果,尝试了很多方法,但都有或多或少的缺陷,可惜最后失败了。不过也算有所得。写文以标记。

其实抓图在4.0以后的版本中,还是很容易实现的,因为系统有十分完美的自带的截图。只要有源码,可以修改系统,通过执行screencap 和screenshot命令可以实现。

  1. public static boolean RootCommand(String command) //申请root权限
  2. {
  3. Process process = null;
  4. DataOutputStream os = null;
  5. try
  6. {
  7. process = Runtime.getRuntime().exec("su");
  8. os = new DataOutputStream(process.getOutputStream());
  9. os.writeBytes(command + "\n");
  10. os.writeBytes("exit\n");
  11. os.flush();
  12. process.waitFor();
  13. } catch (Exception e)
  14. {
  15. Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
  16. return false;
  17. } finally
  18. {
  19. try
  20. {
  21. if (os != null)
  22. {
  23. os.close();
  24. }
  25. process.destroy();
  26. } catch (Exception e)
  27. {
  28. }
  29. }
  30. Log.d("*** DEBUG ***", "Root SUC ");
  31. return true;
  32. }

通过调用系统的截屏程序也能实现。如果要实现进入自己的软件前获得屏幕BUFFER,下面的函数可以实现,返回的BITMAP就是前一屏的BITMAP,不过如果抓图是竖屏,进入自己的程序后变横屏,这个图就没办法变横了。因为我是需要在锁屏时,把前一屏数据结果锁屏做一个动画,所以如果解锁时,前一窗口数据已经变化,这个载屏就没什么用处了。无法实现解锁窗口与前一程序无缝衔接。同时如果你的锁屏如果是在黑屏后才进入,那么这个裁屏截到的也是黑屏了,大家都懂的。

  1. public Bitmap getScreenBuffer()
  2. {
  3. Display mDisplay;
  4. DisplayMetrics mDisplayMetrics;
  5. Matrix mDisplayMatrix = new Matrix();
  6.  
  7. WindowManager mWindowManager = (WindowManager) mContext
  8. .getSystemService(Context.WINDOW_SERVICE);
  9. mDisplay = mWindowManager.getDefaultDisplay();
  10. mDisplayMetrics = new DisplayMetrics();
  11. mDisplay.getRealMetrics(mDisplayMetrics);
  12. mDisplay.getRealMetrics(mDisplayMetrics);
  13. float[] dims = { mDisplayMetrics.widthPixels,
  14. mDisplayMetrics.heightPixels };
  15.  
  16. mlock = Surface.screenshot((int) dims[0], (int) dims[1]);
  17. return mlock;
  18. }

截屏函数在上锁时,由于会黑屏,结果只能抓到黑屏图,所以可以通过调用4.0以后最近运行的程序的快照来替代,大概是ActivityManager.java 中getTaskThumbnails(int)}.但由于我的需要支持横竖屏,所以当解锁前后横竖屏状态不同时,这个快照也失去了意义。

那么只剩下最后一种方式,获得上一次运行的activity的实例,进而获得其getDecorView,把其getDecorView转为BITMAP来运用。获得前一次运行的程序,可以通过以下代码获取:

  1. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  2. List<RunningTaskInfo> cn = am.getRunningTasks(2);
  3. RunningTaskInfo taskInfo = cn.get(1);
  4. ComponentName name = taskInfo.topActivity;
  5. Log.i("jia @@@@@@", "name.getClassName() = "+name.getClassName());
  6. Log.i("jia @@@@@@", "name.getPackageName() = "+name.getPackageName());
  7. Log.i("jia @@@@@@", "name.getClass() = "+name.getClass().toString());
  8. Log.i("jia @@@@@@", "name.getShortClassName() = "+name.getShortClassName());
  1. getRunningTasks可以获得当前运行的程序,参数2为获得最近两个程序,
  1. cn.get(1);为获得倒数第二个运行的程序,如果参数为0,就是当前程序

然后使用动态加载反射其activity

Context cc = null;
        try {
            cc = this.createPackageContext(name.getPackageName(), Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        //载入这个类  
        Class clazz = null;
        try {
            clazz = cc.getClassLoader().loadClass(name.getClassName());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        Activity aa = null;
        try {
            aa = (Activity)clazz.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Intent in = new Intent(cc, clazz);
        in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        this.startActivity(in);
        overridePendingTransition(android.R.anim.slide_in_left,   
                android.R.anim.slide_out_right);

最后,完整的代码

  1. package com.example.testtaskactivity;
  2.  
  3. import java.util.List;
  4.  
  5. import android.os.Bundle;
  6. import android.app.Activity;
  7. import android.app.ActivityGroup;
  8. import android.app.ActivityManager;
  9. import android.app.ActivityManager.RunningTaskInfo;
  10. import android.app.LocalActivityManager;
  11. import android.content.ComponentName;
  12. import android.content.Context;
  13. import android.content.Intent;
  14. import android.content.pm.PackageManager.NameNotFoundException;
  15. import android.graphics.Rect;
  16. import android.util.Log;
  17. import android.view.Menu;
  18. import android.view.View;
  19. import android.view.Window;
  20. import android.widget.RelativeLayout.LayoutParams;
  21.  
  22. public class MainActivity extends ActivityGroup {
  23. private LocalActivityManager localActivityManager = null;
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. }
  30.  
  31. @Override
  32. public boolean onCreateOptionsMenu(Menu menu) {
  33. // Inflate the menu; this adds items to the action bar if it is present.
  34. getMenuInflater().inflate(R.menu.main, menu);
  35. return true;
  36. }
  37.  
  38. public void gettaskview(View view) {
  39. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  40. List<RunningTaskInfo> cn = am.getRunningTasks(2);
  41. RunningTaskInfo taskInfo = cn.get(1);
  42. ComponentName name = taskInfo.topActivity;
  43. Log.i("jia @@@@@@", "name.getClassName() = " + name.getClassName());
  44. Log.i("jia @@@@@@", "name.getPackageName() = " + name.getPackageName());
  45. Log.i("jia @@@@@@", "name.getClass() = " + name.getClass().toString());
  46. Log.i("jia @@@@@@",
  47. "name.getShortClassName() = " + name.getShortClassName());
  48. Activity a = null;
  49. Class c = null;
  50.  
  51. /*
  52. * try { c = Class.forName(name.getClassName()); Log.i("jia @@@@@@",
  53. * "c = "+c.getName().toString()); } catch (ClassNotFoundException e) {
  54. * // TODO Auto-generated catch block e.printStackTrace();
  55. * Log.i("jia @@@@@@", "11111111111111111 "); } try { a =
  56. * (Activity)c.newInstance(); Log.i("jia @@@@@@", "a = "+a.toString());
  57. * } catch (InstantiationException e) { // TODO Auto-generated catch
  58. * block e.printStackTrace(); } catch (IllegalAccessException e) { //
  59. * TODO Auto-generated catch block e.printStackTrace(); }
  60. */
  61. /*
  62. * View currentScreen = a.getWindow().getDecorView();
  63. *
  64. * this.addContentView(currentScreen, new LayoutParams(
  65. * LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  66. */
  67. // this.createPackageContext(packageName, flags);
  68. Context cc = null;
  69. try {
  70. cc = this.createPackageContext(name.getPackageName(),
  71. Context.CONTEXT_INCLUDE_CODE
  72. | Context.CONTEXT_IGNORE_SECURITY);
  73. } catch (NameNotFoundException e) {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. }
  77. // 载入这个类
  78. Class clazz = null;
  79. try {
  80. clazz = cc.getClassLoader().loadClass(name.getClassName());
  81. } catch (ClassNotFoundException e) {
  82. // TODO Auto-generated catch block
  83. e.printStackTrace();
  84. }
  85. Activity aa = null;
  86. try {
  87. aa = (Activity) clazz.newInstance();
  88. } catch (InstantiationException e) {
  89. // TODO Auto-generated catch block
  90. e.printStackTrace();
  91. } catch (IllegalAccessException e) {
  92. // TODO Auto-generated catch block
  93. e.printStackTrace();
  94. }
  95. // PolicyManager.makeNewWindow(context);
  96. // View v = aa.getWindow().getDecorView();
  97. // setContentView(v);
  98. Intent in = new Intent(cc, clazz);
  99. in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
  100. | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
  101. this.startActivity(in);
  102. overridePendingTransition(android.R.anim.slide_in_left,
  103. android.R.anim.slide_out_right);
  104. /*
  105. * Rect frame = new Rect();
  106. * getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int
  107. * statusBarHeight = frame.top; Log.i("jia @@@@@@",
  108. * "statusBarHeight = " + statusBarHeight);
  109. *
  110. *
  111. * LocalActivityManager mgr = this.getLocalActivityManager();
  112. * Intent in
  113. * = new Intent(this, clazz); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
  114. * | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); Window w =
  115. * mgr.startActivity("aaa", in); View v =w.getDecorView(); //View v =
  116. * a.getWindow().getDecorView(); setContentView(v);
  117. */
  118.  
  119. }
  120.  
  121. }

这样可以使唤得我们可以在不同的应用之间使用动画跳转,但我尝试使用Window w = mgr.startActivity("aaa", in)获得前一activity的VIEW时,提示该activity没有在我的

AndroidManifest.xml中声明,第三方的和系统的应用,本不该在我的应用中声明,可能是因为别人的VIEW不能为我所用吧。抓图程序需要system权限,需要在AndroidManifest.xml文件的manifest标签中声明,android:sharedUserId="android.uid.system"。要不抓不了图,也获取不了屏幕的bitmap,Surface.screenshot函数是系统的隐藏API,不可在APK中直接使用,需要写一个如下的MK文件,放在源码目录下使用MM编绎:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_JAVA_LIBRARIES := bouncycastle \
                        framework    \
                        mediatek-framework

LOCAL_CERTIFICATE := platform

LOCAL_STATIC_JAVA_LIBRARIES := \
    android-support-v4

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := Scr

#LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

本文不可转载,需注明出处:

http://blog.csdn.net/cnbloger/article/details/10029633

android为应用程序添加退出动画的更多相关文章

  1. Android系统的“程序异常退出”[转]

    在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场. 如何处理未捕获的异常呢? 首先我们要实现一个接口  java.lang.Thread.UncaughtExcep ...

  2. android捕获程序异常退出

    今天看到迅雷动漫里面一个CrashHandler 的类,我猜是崩溃处理类.进去一看.果然.顺便学习一下. Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕 ...

  3. Android程序完全退出的三种方法

    很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...

  4. 【转】Android应用程序完全退出

    原文网址:http://www.yoyong.com/archives/199 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://s ...

  5. Android企业级程序完全退出的解决方案

    一.问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一般要么是一个简单的finish(只是退出当前的activity),要么是其他的方法,比如: 1.第一种方法:首先 ...

  6. Android企业级程序完全退出的解决方案【转】

    http://blog.csdn.net/wangjinyu501/article/details/8763552 问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一 ...

  7. Android动画效果之自定义ViewGroup添加布局动画

    前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...

  8. 你真的有必要退出吗——再说Android程序的退出功能

    转自你真的有必要退出吗--再说Android程序的退出功能 搞Android开发有一段时间了,相信很多从Windows开发过来的Android程序员都习惯性地会跟我一样遇到过同一个问题:如何彻底退出程 ...

  9. Android至ViewPager添加切换动画——使用属性动画

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/44200623 ViewPager作为Android最经常使用的的组件之中的一个.相 ...

随机推荐

  1. SOA Demo

    使用SOA来实现两个数字的相加,不包含验证,仅供练习使用. PDF文档下载地址:http://files.cnblogs.com/chenyongblog/SOA_Demo.pdf 源码下载:http ...

  2. c++线程传参问题

    std::thread可以和任何可调用类型一起工作,可调用对象和函数带有参数时,可以简单地将参数传递给std::thread的构造函数 例如: #include<iostream> #in ...

  3. google calendar

    1. user guide on google https://developers.google.com/google-apps/calendar/instantiate 2. google app ...

  4. vs2013中头文件中大小写的切换的快捷键

    1.选中内容 2.ctrl+shift+u 例如:  #include "LayerStart.h"   ->   #include "LAYERSTART.H&q ...

  5. Spiral Matrix

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  6. Error: Most middleware (like bodyParser) ...

    运行NodeJS时出现如下错误: Error: Most middleware (like bodyParser) is no longer bundled with Express and must ...

  7. ADT eclipse打开时出现Error: Error parsing C:\Users\admin*\.android\devices.xml

    Error: Error parsing C:\Users\admin*\.android\devices.xml  在ADT eclipse打开项目的时候出现此提示,但是又不影响使用. 原因:之前安 ...

  8. PHP的会话处理函数session

    (๑•ᴗ•๑) PHP Session 变量 当运行一个应用程序时,你会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个 ...

  9. EXT经验--查询EditorGridPanel的tbar的默认配置对象

    前言:EXT的API可谓熟悉EXT的葵花宝典,会看API可谓对于配置EXT,学习EXT最重要的基本功,这点相对于学习轻量级的Easyui来说更加明显. 比如下面的一段代码:注:在Ext.grid.Ed ...

  10. 【CodeForces】【#286】Div.2

    T_T越来越水了,这次只做出A+B. A题为了代码简单直接枚举(插入位置和插入字符) //CF #286 Div.2 A #include<vector> #include<stri ...