‘壹’ android如何获取最顶层窗口 csdn
{
publicStringpackageName="";
publicStringtopActivityName="";
}
(){
ActivityManagermanager=((ActivityManager)GlobalConfig.getContext().getSystemService(Context.ACTIVITY_SERVICE));
TopActivityInfoinfo=newTopActivityInfo();
if(Build.VERSION.SDK_INT>=21){
List<ActivityManager.RunningAppProcessInfo>pis=manager.getRunningAppProcesses();
ActivityManager.=pis.get(0);
if(topAppProcess!=null&&topAppProcess.importance==ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
info.packageName=topAppProcess.processName;
info.topActivityName="";
}
}else{
//getRunningTasks()isdeprecatedsinceAPILevel21(Android5.0)
ListlocalList=manager.getRunningTasks(1);
ActivityManager.=(ActivityManager.RunningTaskInfo)localList.get(0);
info.packageName=localRunningTaskInfo.topActivity.getPackageName();
info.topActivityName=localRunningTaskInfo.topActivity.getClassName();
}
returninfo;
}
‘贰’ 如何获得当前的activity android
android开发中获取当前的Activity有多种情况;
在Activity中,this就是当前的Activity,例如this.startActivity。
在Fragment中可以通过 getActivity()来得到当前装载这个Fragment的Activity。
通过Activity堆栈来获取当前显示的这个Activity
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
‘叁’ android 如何获取一个界面最顶层的view并处理单击事件的分发机制
android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:
(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。
(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。
‘肆’ 如何获取TASK中的Activity
ActivityManager manager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> info=manager.getRunningTasks(1);
String classname = null;
if( null != info && !(info.isEmpty())){
classname=info.get(0).topActivity.getClassName();
if (classname.equals("com.android.settings.CryptKeeper")) {
return;
}else {
.......
}
}else{
...............
}
说明:String shortClassName = info.get(0).topActivity.getShortClassName(); //类名
String className = info.get(0).topActivity.getClassName(); //完整类名
String packageName = info.get(0).topActivity.getPackageName(); //包名
getRunninTask(int max)获得当前的max个task的list<ActivityManager.runningTask>,实际个数可能少于max个,取决于当前运行的task个数是否大于max个。
get(0)取得当前使用的runningTask,get(1)是上一次使用的runningTask
ActivityManager.runningTask的topActivity可以获得取得runingTask的顶层activity
在androidmanifest.xml中,添加用户权限 <uses-permissionAndroid:name="android.permission.GET_TASKS">
‘伍’ android 获取所有正在运行的activity
首先是新建一个Android工程,然后修改【main.xml】文件如下:
添加一个ListView
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tasklist"
/>
</LinearLayout>
然后编辑【java代码】
[java] view plain
package com.cayden.run;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class MyActivityRunDemo extends Activity {
private ListView tasklist=null;
private ListAdapter adapter=null;
private List<String> all=new ArrayList<String>();
private ActivityManager activityManager=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tasklist=(ListView)this.findViewById(R.id.tasklist);
activityManager=(ActivityManager)super.getSystemService(Context.ACTIVITY_SERVICE);
listActivity();
}
public void listActivity(){
List<RunningTaskInfo> tasks= activityManager.getRunningTasks(30);
Iterator<RunningTaskInfo> itInfo=tasks.iterator();
while(itInfo.hasNext()){
RunningTaskInfo info=itInfo.next();
all.add("【id="+info.id+"】,"+info.baseActivity.getClassName());
}
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,this.all);
tasklist.setAdapter(adapter);
}
}
最后需要再配置所需要的权限【AndroidManifest.xml】
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cayden.run"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyActivityRunDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
</manifest>
程序运行效果如图所示:
‘陆’ 如何获取android app的Activity
工具/原料:
app
android手机
数据线
1.需要配置好android的开发环境后,打开cmd命令窗口
‘柒’ android要将一个activity置于屏幕顶层,怎么弄
这种关键的可以考虑下设置 android:noHistory = "true" 如果有别的activity盖在上面就消失了
祝你愉快,满意请采纳哦
‘捌’ Android 如何获取最顶端的Top Activity
Android 如何获取最顶端的Top Activity, 见如下代码:
[java] view plain
public static class TopActivityInfo {
public String packageName = "";
public String topActivityName = "";
}
[java] view plain
private TopActivityInfo getTopActivityInfo() {
ActivityManager manager = ((ActivityManager)GlobalConfig.getContext().getSystemService(Context.ACTIVITY_SERVICE));
TopActivityInfo info = new TopActivityInfo();
if (Build.VERSION.SDK_INT >= 21) {
List<ActivityManager.RunningAppProcessInfo> pis = manager.getRunningAppProcesses();
ActivityManager.RunningAppProcessInfo topAppProcess = pis.get(0);
if (topAppProcess != null && topAppProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
info.packageName = topAppProcess.processName;
info.topActivityName = "";
}
} else {
//getRunningTasks() is deprecated since API Level 21 (Android 5.0)
List localList = manager.getRunningTasks(1);
ActivityManager.RunningTaskInfo localRunningTaskInfo = (ActivityManager.RunningTaskInfo)localList.get(0);
info.packageName = localRunningTaskInfo.topActivity.getPackageName();
info.topActivityName = localRunningTaskInfo.topActivity.getClassName();
}
return info;
}
‘玖’ android开发问题:如何在当前Acitivity中用代码获取上一个Activity名称
需要在跳转的Intent对象中添加一个参数:
intent.putExtra("comeFrom",activityName);
跳转到目标activity时带上当前activity的名字,这样才知道是从哪里跳转进来的。
‘拾’ android 如何获取当前界面最上面的activity
在Android系统中,Activity窗口的大小是由WindowManagerService服务来计算的。WindowManagerService服务会根据屏幕及其装饰区的大小来决定Activity窗口的大小。一个Activity窗口只有知道自己的大小之后,才能对它里面的UI元素进行测量、布局以及绘制。本文将详细分析WindowManagerService服务计算Activity窗口大小的过程。
一般来说,Activity窗口的大小等于整个屏幕的大小,但是它并不占据着整块屏幕。为了理解这一点,我们首先分析一下Activity窗口的区域是如何划分的。
我们知道,Activity窗口的上方一般会有一个状态栏,用来显示3G信号、电量使用等图标,如图1所示。
图1 Activity窗口的Content区域示意图
从Activity窗口剔除掉状态栏所占用的区域之后,所得到的区域就称为内容区域(Content Region)。顾名思义,内容区域就是用来显示Activity窗口的内容的。我们再抽象一下,假设Activity窗口的四周都有一块类似状态栏的区域,那么将这些区域剔除之后,得到中间的那一块区域就称为内容区域,而被剔除出来的区域所组成的区域就称为内容边衬区域(Content Insets)。Activity窗口的内容边衬区域可以用一个四元组(content-left, content-top, content-right, content-bottom)来描述,其中,content-left、content-right、content-top、content-bottom分别用来描述内容区域与窗口区域的左右上下边界距离。
我们还知道,Activity窗口有时候需要显示输入法窗口,如图2所示。
图2 Activity窗口的Visible区域示意图
这时候Activity窗口的内容区域的大小有可能没有发生变化,这取决于它的Soft Input Mode。我们假设Activity窗口的内容区域没有发生变化,但是它在底部的一些区域被输入法窗口遮挡了,即它在底部的一些内容是不可见的。从Activity窗口剔除掉状态栏和输入法窗口所占用的区域之后,所得到的区域就称为可见区域(Visible Region)。同样,我们再抽象一下,假设Activity窗口的四周都有一块类似状态栏和输入法窗口的区域,那么将这些区域剔除之后,得到中间的那一块区域就称为可见区域,而被剔除出来的区域所组成的区域就称为可见边衬区域(Visible Insets)。Activity窗口的可见边衬区域可以用一个四元组(visible-left, visible-top, visible-right, visible-bottom)来描述,其中,visible-left、visible-right、visible-top、visible-bottom分别用来描述可见区域与窗口区域的左右上下边界距离。
在大多数情况下,Activity窗口的内容区域和可见区域的大小是一致的,而状态栏和输入法窗口所占用的区域又称为屏幕装饰区。理解了这些概念之后,我们就可以推断,WindowManagerService服务实际上就是需要根据屏幕以及可能出现的状态栏和输入法窗口的大小来计算出Activity窗口的整体大小及其内容区域边衬和可见区域边衬的大小。有了这三个数据之后,Activity窗口就可以对它里面的UI元素进行测量、布局以及绘制等操作了。
从前面Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析一文可以知道,应用程序进程是从ViewRoot类的成员函数performTraversals开始,向WindowManagerService服务请求计算一个Activity窗口的大小的,因此,接下来我们就从ViewRoot类的成员函数performTraversals开始分析一个Activity窗口大小的计算过程,如图3所示。
图3 Activity窗口大小的计算过程
这个过程可以分为11个步骤,接下来我们就详细分析每一个步骤。
Step 1. ViewRoot.performTraversals
这个函数定义在文件frameworks/base/core/java/android/view/ViewRoot.java中,它的实现很复杂,一共有600-行,不过大部分代码都是用来计算Activity窗口的大小的,我们分段来阅读:
[java] view plainpublic final class ViewRoot extends Handler implements
ViewParent,
View.AttachInfo.Callbacks {
......
private void performTraversals() {
......
final View host = mView;
......
int desiredWindowWidth;
int desiredWindowHeight;
int childWidthMeasureSpec;
int childHeightMeasureSpec;
......
Rect frame = mWinFrame;
if (mFirst) {
......
DisplayMetrics packageMetrics =
mView.getContext().getResources().getDisplayMetrics();
desiredWindowWidth = packageMetrics.widthPixels;
desiredWindowHeight = packageMetrics.heightPixels;
} else {
desiredWindowWidth = frame.width();
desiredWindowHeight = frame.height();
if (desiredWindowWidth != mWidth || desiredWindowHeight != mHeight) {
......
windowResizesToFitContent = true;
}
}
复制代码
这段代码用来获得Activity窗口的当前宽度desiredWindowWidth和当前高度desiredWindowHeight。