当前位置:首页 » 安卓系统 » android显示activity

android显示activity

发布时间: 2022-05-21 03:49:16

① android 3.0以下的版本怎么调出activity到前台

项目是环境是android,编译版本是1.6,因为功能的需要,在手机使用界面activity1点击返回键/Home键,不希望activity1退出,因此调用了moveTaskToBack,将任务移到了任务栈底,但当项目需要wifi下的安装apk时,因考虑到权限的问题,需要将activity1调出到前台,然后在其上调用安装界面(需要用户手动点击安装、取消),但又要activity截获用户的点击结果(安装or取消),所以使用startActivityForResult函数。

本想使用moveTastToFront将activity1显示,但是貌似是3.0以上的版本才支持,只能放弃。

但试了多种调用activit1到前台,如下一:

[cpp] view plainprint?

Intent it1 = new Intent(context, activity1.class);

it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

context.startActivity(it1);
Intent it1 = new Intent(context, activity1.class);
it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
context.startActivity(it1);

但使用FLAG_ACTIVITY_NEW_TASK标记后,startActivityForResult的结果获取不到,至少点击返回/取消获取不到(点击安装的话安装成功会有广播)

使用下面的方法(屏蔽FLAG_ACTIVITY_NEW_TASK标志),如下二:

[cpp] view plainprint?

Intent it1 = new Intent(context, activity1.class);

/ it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

context.startActivity(it1);
Intent it1 = new Intent(context, activity1.class);
// it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
context.startActivity(it1);
调出activity1到前台时又会碰到在4.2.2系统下不能显示出来的问题,虽然在任务列表键上点击运行的任务点击activity1的apk时能在其上显示安装界面,但该界面需要用户自己点击出现,不符合要求。

最后google了几次,发现“android的activity中不能使用startAcitivity来将自己提前到stack的前面,所以startActivity的context不能是自己的Activity。”(参考链接http://hi..com/cwhxguscbakrd/item/4358a413ad37f9f687ad4e91),根据提示,解决方法终于找到,即调用startActivity前调用下getApplicationContext(),如下:

[cpp] view plainprint?

Intent it1 = new Intent(context, activity1.class);

it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //两种都可以

it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

context.getApplicationContext().startActivity(it1);
Intent it1 = new Intent(context, activity1.class);
// it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //两种都可以
it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.getApplicationContext().startActivity(it1);

当然,因为要考虑到wifi下连续多次安装apk的情况(在用户点击安装、取消前又有新的apk安装到来),同时要兼顾获取安装结果,所以如下改动:

[cpp] view plainprint?

public static void installPackage(Context context, File file, int requestCode) {

//安装列表自己控制个进度,一次安装有了结果后再进行下一个的安装

activity1.m_bInInstallProcee = true;

//gxj: 如果需要,需要调出daemon到前台

if (!CommonTools.isAppOnForeground(context))

{

//貌似android 3.0以上才支持,若支持,直接使用即可

// context.moveTaskToFront();

Intent it1 = new Intent(context, activity1.class);

// it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

context.getApplicationContext().startActivity(it1);

}

if (true)

{

Intent intent = new Intent();

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP );

intent.setAction(android.content.Intent.ACTION_VIEW);

Uri path = Uri.fromFile(file);

intent.setDataAndType(path, "application/vnd.android.package-archive");

if (requestCode < android.app.Activity.RESULT_CANCELED) {

context.startActivity(intent);

}

else {

((Activity) context).startActivityForResult(intent, requestCode);

}

}

}
public static void installPackage(Context context, File file, int requestCode) {
//安装列表自己控制个进度,一次安装有了结果后再进行下一个的安装
activity1.m_bInInstallProcee = true;

//gxj: 如果需要,需要调出daemon到前台
if (!CommonTools.isAppOnForeground(context))
{
//貌似android 3.0以上才支持,若支持,直接使用即可
// context.moveTaskToFront();

Intent it1 = new Intent(context, activity1.class);
// it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.getApplicationContext().startActivity(it1);
}

if (true)
{
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP );
intent.setAction(android.content.Intent.ACTION_VIEW);
Uri path = Uri.fromFile(file);
intent.setDataAndType(path, "application/vnd.android.package-archive");

if (requestCode < android.app.Activity.RESULT_CANCELED) {
context.startActivity(intent);
}
else {
((Activity) context).startActivityForResult(intent, requestCode);
}
}
}
其中判断当前activity是否在前台的判断如下:

[cpp] view plainprint?

public class CommonTools {

public static boolean isAppOnForeground(Context context) {

// Returns a list of application processes that are running on the

// device

ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);

String packageName = context.getApplicationContext().getPackageName();

List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();

if (appProcesses == null)

return false;

for (RunningAppProcessInfo appProcess : appProcesses) {

// The name of the process that this object is associated with.

if (appProcess.processName.equals(packageName)

&& appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

return true;

}

}

return false;

}

}

② android 多个activity怎么知道打开程序时首先是显示哪个activity呢

在AndroidManifest.xml文件里可以配置
假如你创建了一个helloworld程序 那么androidManifest.xml里会有这么一段
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloworldActivity"
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>
你把第2行的android:name=".HelloworldActivity"中的HelloworldActivity改为其他的activity名字就行了

③ android 小白问一下,一个应用已经打开,返回栈里面已经有多个Activity,再次启动如何显示栈顶的Activity

再次启动,默认就显示栈顶的Activity.
有2种情况不是,一个是内存不足,会清除数据,启动应用后从初始化main标识的页面开始;另一个是应用自己退出了。

④ 如何在Android中实现悬浮Activity

这里主要有三个任务:

计算已有的Activity的尺寸并确定它的新坐标位置;
使Activity透明,可以看见其背景;
处理背景使其不能再和用户进行交互。

计算窗口大小

前面提到,我们需要以一个已有的手机APP为基础(使用了ActionBarSherlock库),这个库我们已经以一个外部库的形式集成到项目中,并带有源代码。

如果对ABS的源码很熟悉或者曾对原生ActionBar的构架有了解,就会发现:如果改变Activity的大小,那在调用
setContentView方法的时候,功能没有实现:ActionBar的大小和位置都没有变化。这时要做的就是在更高的级别里操作,在系统绘制
ActionBar的时候——ABS或者原生的ActionBar,这时候还没有任何窗口的数据,这样我们就可以按照需要调整了。

最显而易见的方式就是改变Window的尺寸,所以这里需要以下这段代码:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();

if (getResources().getBoolean(R.bool.is_tablet) && mOpenAsSmallWindow) {
final View view = getWindow().getDecorView();
final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams();

lp.gravity = Gravity.CENTER;

lp.width = mActivityWindowWidth;
lp.height = mActivityWindowHeight;
getWindowManager().updateViewLayout(view, lp);
}
}
代码执行完毕后,就可以看到窗口的大小已经根据mActivityWindowWidth和mActivityWindowHeight的值发生了改变。

is_tablet检查只对平板有效,mOpenAsSmallWindow标识表示是否让窗口全屏显示或者是否作为新的窗口渲染。
如果在运行的时候报错了,错误日志是:ActionBarView can only be used with android:layout_width="match_parent" (or fill_parent).那不用担心,我们有ABS的源码,直接修改源码就可以了。

打开ActionBarView这个文件,然后再onMeasure方法里把抛出的异常注释掉——这样应该就可以解决问题了。安卓上使用的是比较特殊的权限控制机制,所以这里我们可以继续深入的不多,也许还能粗略计算菜单项等,不过很多东西我们都不可把控。

注意:这个方法没有在原生ActionBar上测试,因为这里只是在作者的Android版本中测试过。如果要禁用ActionBar,需要找到ActionBarSherlock这个类,然后注释掉以下这行代码:
// registerImplementation(ActionBarSherlockNative.class);
代码运行应该没问题,然后就可以看到不透明背景的Activity了。
添加透明功能

在实现了Activity的尺寸和大小都改变后,现在就要让它透明了。可以给这个平板上的Activity主题添加这个属性:
<item name="android:windowIsTranslucent">true</item>
这个属性值可以使Activity背景透明。
看起来不错,效果已经基本实现了。

还有一个小问题:以上测试的都是在Nexus7 android4.3上执行,而这个App在Nexus7 的android4.2版本中,Activity没有显示。

经过多次调试和日志检查后,发现我们的Activity(就叫MainActivity吧)没有被销毁(没有调用onDestroy方法),所
以Android系统就把它忽略了,没有绘制它。为什么呢?因为Android 4.4
KitKat新增了一个优化算法。因为这个优化算法,Android系统看到Activity为全屏显示模式(不管WindowManager的改变),
就会绘制这个MainActivity,但是它之上的东西就被忽略了,所以我们就看不到任何显示了。

我们研究了下这个问题,然后发现对话框和其他不全屏显示的部件都可以正常绘制,所以我们需要在主题theme里加上这几行:
<item name="android:windowIsFloating">true</item>
<item name="android:windowCloseOnTouchOutside">false</item>
<item name="android:colorBackgroundCacheHint"><a href="http://www.jobbole.com/members/NULL/" rel="nofollow">@null</a></item>
<item name="android:backgroundDimEnabled">true</item>

⑤ 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。

⑥ 在android开发中,先显示Activity_1,由Activity_1跳转到Activity_2

手势只是动作,跳转是行为,
先用手势库实现手势动作,再把触发操作放在手势动作中即可

⑦ 如何获得当前的activity android

android开发中获取当前的Activity有多种情况;

  1. 在Activity中,this就是当前的Activity,例如this.startActivity。

  2. 在Fragment中可以通过 getActivity()来得到当前装载这个Fragment的Activity。

  3. 通过Activity堆栈来获取当前显示的这个Activity

    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

    ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

⑧ Android UI开发中,设置Activity的什么属性可以使Activity显示为对话框样式.

将activity设置成对话框样式,只需在activity属性里面增加下面一句代码:

热点内容
存储过程是先编译好的吗 发布:2025-08-21 15:25:07 浏览:888
java高并发编程详解 发布:2025-08-21 15:11:27 浏览:549
pythonappenddict 发布:2025-08-21 14:49:16 浏览:391
解压跳舞 发布:2025-08-21 14:48:59 浏览:959
泛二级站群服务器搭建 发布:2025-08-21 14:36:44 浏览:206
11代i5编译速度 发布:2025-08-21 14:33:08 浏览:39
安卓核心板是什么 发布:2025-08-21 14:18:36 浏览:626
车牌提取算法 发布:2025-08-21 14:17:51 浏览:147
g盘无法访问拒绝访问 发布:2025-08-21 14:17:38 浏览:458
eoflinux 发布:2025-08-21 13:55:35 浏览:106