分析如何win10安全中心怎么退出退出多个Activity 多种方式

android开发源码分析--多个activity调用多个jni库的方法
有时候,我们在开发android项目时会遇到需要调用多个native c/jni库文件,以下是本人曾经实现过的方法,如果有知道其他方法,还望不吝指教。
例如,在android工程里有两个activity,分别是activity1和activity2,(可以进入工程目录bin/classes路径下查看有哪些),在这两个activity里都有调用jni,步骤如下:
在activity1和activity2里分别声明native
例如:activity1.java里
private native String
StringFromActivity1Jni();
System.loadLibrary("activity1");
Activity2.java里
private native String
StringFromActivity2Jni();
System.loadLibrary("activity2");
生成 .h文件
用命令:javah -classpath bin/classes/ -jni com.myprj.uitest.activity1和javah
-classpath bin/classes/ -jnicom.myprj.uitest.activity2 生成activity1和activity2里的头文件
需要特别注意的是红色部分,一定要存在。可以进入工程目录bin/classes路径下查看。如果不能在jni下生成,那就mv吧。
编写Android.mk文件:
LOCAL_PATH := $(call my-dir)
//只能有一个这个路径
include $(CLEAR_VARS)
LOCAL_MODULE
:= activity1
LOCAL_C_INCLUDES += $(LOCAL_PATH) \
$(LOCAL_PATH)/android
LOCAL_SRC_FILES := activity1.c
LOCAL_LDLIBS
:= -L$(LOCAL_PATH) -lm -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE
:= activity2
LOCAL_C_INCLUDES += $(LOCAL_PATH) \
$(LOCAL_PATH)/android
LOCAL_SRC_FILES := activity2.c
LOCAL_LDLIBS
:= -L$(LOCAL_PATH) -lm -lz -llog
include $(BUILD_SHARED_LIBRARY)
需要注意的是:include $(BUILD_SHARED_LIBRARY)是生成动态库,也可以生成静态库include
$(PREBUILT_STATIC_LIBRARY)
4、 编译:
多个activity直接如何Sqlite中的数据
没有更多推荐了,启动多个Activity&一次如何退出
多activity中退出整个程序,例如从A-&B-&C-&D,这时我需要从D直接退出程序。
网上资料:
finish()和system(0)都只能退出单个activity。杀进程等的等方式都不行~~~
解决问题:
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。
在D中使用下面的代码:
Intent intent = new Intent();
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);&&//注意本行的FLAG设置
startActivity(intent);
finish();关掉自己
在A中加入代码:
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
((Intent.FLAG_ACTIVITY_CLEAR_TOP &
intent.getFlags()) != 0) {
A的Manifest.xml配置成android:launchMode="singleTop"
原理总结:
一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode="singleTop"
不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A
finish()掉。
栈中A,B,C,D全部被清理。所以整个程序退出了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客分类:
在Android系统中,默认情况下,每开启一个Activity,都在会当前的任务栈中压入一个新的Activity,当我们在一个Application中开发了多个Activity的时候,如果想要退出应用,那么我们需要按多此返回键才能退出...这样就造成用户体验很不好的情况..
那么,怎样做才能让用户在想退出Application的时候,只按一个返回键就能退出呢??
其实有很多的解决方法,今天这里介绍一种相对安全,而且用户体验就比较好的方法,供自己以后查阅
首先,我们都知道,在Android应用中,全局只有一个Application,尽管我们平时很少使用它...但是,我们每次打开manifest文件的时候,在Activity标签外层,都被一个Application包裹住,这个其实就是我们的Application,全局只有一个,并且这个Application在Android中是作为程序的入口,相当于在Java中的main函数....
那么,问题来了...有这个Application,有什么用途呢?....
前面说到,这个Application在整个应用程序中是唯一的,全局只有一个,Application中有一个onCreate方法,这个方法会在当前应用所有对象被创建之前就会执行....
1.在Application中持有一个全局的集合(List),进而在其onCreate()方法中,实例化该集合对象
2.在Activity的onCreate方法中,通过getApplication()获取到当前应用的Application对象,通过对象,就可以在获取到里面的全局的集合,就可以将当前的Activity加入到集合中去,每一个Activity的onCreate方法中,都执行相同的操作
3.通过上述的操作,我们就可以收集到所有已经被打开的Activity
4.在每一个Activity的onBackPressed()方法中,获取该全局的集合(List) ,遍历集合,获取每一个Activity,并且调用其finish()方法即可
下面上代码
Application.java
public class MyApplication extends Application {
public List&Activity& myA
public void onCreate() {
myApps = new ArrayList&&();
super.onCreate();
FirstActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
MyApplication myApplication = (MyApplication) getApplication();
myApplication.myApps.add(this);
..... 有多少个Activity就执行多少此add方法
最后,在每一个Activity的onBackPressed()方法中,调用下面的方法
同时在Activity的onDestroy()方法中,从集合中移除当前的Activity
public void onBackPressed() {
super.onBackPressed();
MyApplication myApplication = (MyApplication) getApplication();
for (Activity acticity : myApplication.myApps) {
acticity.finish();
protected void onDestroy() {
super.onDestroy();
MyApplication myApplication = (MyApplication) getApplication();
myApplication.myApps.remove(this);
浏览: 1501 次
来自: 东莞
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'400-650-7353
Android面试题:如何安全退出已调用多个Activity的Application?
在当今的互联网大军中,不少人顺应时代潮流,选择了Android开发作为自己的发展方向,进行。今天,优就业的老师给大家分享一下:如何安全退出已调用多个Activity的Application?
1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
官方微信更多精彩,扫码关注 或微信搜索:ujiuye
官方微博更多精彩,扫码关注 或微博搜索:优就业
注:本站稿件未经许可不得转载,转载请保留出处及源文件地址。
(责任编辑:zhangjs)
关键词阅读
[免责声明]本文来源于网络转载,仅供学习交流使用,不构成商业目的。版权归原作者所有,如涉及作品内容、版权和其它问题请在30日内与本网联系,我们将在第一时进行处理
(点击一键加群)对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。当然,网上也有人说可以。就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME即可,而事实上如果不修改framework,根本不可能做到这一点一样。所以,最好还是自己亲自试一下。那么,有没有办法直接退出整个应用呢?
现提供几个方法,供参考:1、抛异常强制退出:该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。2、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
public class ActivityManagerApplication extends Application {
private static Map&String,Activity& destoryMap = new HashMap&&();
private ActivityManagerApplication() {
* 添加到销毁队列
* @param activity 要销毁的activity
public static void addDestoryActivity(Activity activity,String activityName) {
destoryMap.put(activityName,activity);
*销毁指定Activity
public static void destoryActivity(String activityName) {
Set&String& keySet=destoryMap.keySet();
for (String key:keySet){
destoryMap.get(key).finish();
3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。4、递归退出在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个Activity基类,处理这些共通问题。
5、在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接结束整个应用。在使用时需要权限.permission.RESTART_PACKAGES。注意不要被它的名字迷惑。可是,在2.2,这个方法失效了。在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId="android.uid.system"属性同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。而Android.mk是用于在Android源码下编译程序用的。从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。
使用forceStopPackage的方法如下:
做一个应用,需要强制关闭进程。
可以使用ActivityManager的killBackgroundProcesses方法,需要权限.permission.KILL_BACKGROUND_PROCESSES。但使用此方法杀死进程后,进程会重启。源码中解释如下:
Have the system immediately kill all background processes associated with the given package.& This is the same as the kernel killing those process the system will take care of restarting these processes in the future as needed.
为了强制关闭进程,希望使用ActivityManager的另外一个方法,forceStopPackage。源码中解释如下:
Have the system perform a force stop of everything associated with the given application package.& All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc.& In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED} broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.
使用这个方法有两点需要注意:
- 此方法是@hide的方法:
解决方案是使用java的反射机制完成调用,代码如下:
ActivityManager&mActivityManager&=&(ActivityManager)&mContext.getSystemService(Context.ACTIVITY_SERVICE);&&
Method&method&=&Class.forName("android.app.ActivityManager").getMethod("forceStopPackage",&String.class);&&
method.invoke(mActivityManager,&packageName);&&
- 此方法需要权限:android.permission.FORCE_STOP_PACKAGES
下面着手分析这个权限。
这个权限在frameworks/base/core/res/AndroidManifest.xml文件中声明,如下:
&android:permissionGroup="android.permission-group.SYSTEM_TOOLS"&&
&android:protectionLevel="signature"&&
&android:label="@string/permlab_forceStopPackages"&&
&android:description="@string/permdesc_forceStopPackages"
注意protectionLevel属性值未signature。看sdk文档http://developer.android.com/guide/topics/manifest/permission-element.html#plevel中对这一属性的解释如下:
A permission that the system grants only if the requesting application is signed with the same certificate as the application that declared the permission. If the certificates match, the system automatically grants the permission without notifying the user or asking for the user's explicit approval.
意思是:app使用FORCE_STOP_PACKAGES权限,app必须和这个权限的声明者的签名保持一致!
FORCE_STOP_PACKAGES的声明者是frameworks/base/core/res/,可以在frameworks/base/core/res/Android.mk中看到它的签名信息:
LOCAL_NO_STANDARD_LIBRARIES&:=&true&&
LOCAL_PACKAGE_NAME&:=&framework-res&&
LOCAL_CERTIFICATE&:=&platform&&
即,签名为platform.&
最终得到结论,app需要是platform签名,才可以使用forceStopPackage方法!
网上有很多文章提及,需要在app的AndroidManifest.xml中添加android:sharedUserId="android.uid.system"一句话。看sdk(http://developer.android.com/guide/topics/manifest/manifest-element.html)对此的解释:
android:sharedUserIdThe name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID &&provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.
意思是,两个app使用了相同的user id,就可以互相访问对方的数据。因此,app使用android.uid.system的user id,就可以访问系统数据。注意背景为黄色的一句,这里依然需要两个app有相同的签名才行。
阅读(...) 评论()}

我要回帖

更多关于 win10安全中心怎么退出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信