首页 > 其他分享 >Android利用activity启动模式退出整个应用

Android利用activity启动模式退出整个应用

时间:2023-05-21 23:07:07浏览次数:47  
标签:启动 activity 模式 实例 应用 Activity Android android


前面我们来先看一下目前网上提供的几种方案:
1.退出单个activity
1)、获取当前进程的id,杀死该进程。 android .os.Process.killProcess(android.os.Process.myPid())
2)、终止当前正在运行的Java虚拟机方法。System.exit(0); 

3)、finish();
4)、杀包方式。
  ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);   
  manager.restartPackage(getPackageName()); 
  添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;
(在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)

2.退出整个应用(多个Activity)

   以下我直接列出网上给出的几种方案,就不做详细说明了。
1)、制造抛异常导致程序强制退出:

2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity

3)、广播方式:

4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下activity四种模式的概念,因为这个退出方法跟   activity的启动模式有一定的关系;

1)、standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。

2)、singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它( 在重用的这个过程中会调用实例的OnNewIntent()这个方法 ),否则就创建新的Activity实例。

3)、singleTask 模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例( 在重用的这个过程中会调用实例的OnNewIntent()这个方法 )。重用时, 如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈 。如果栈中不存在该实例,将会创建新的实例放入栈中。

4)、singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中, 刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈 。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成 singleTask  模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……

package com.test.launchmode; 
  
import android.app.Activity; 
  
import android.content.Intent; 
  
import android.os.Bundle; 
  
import android.util.Log; 
  
public class  MainActivity extends Activity { 
  
@Override 
  
protected final void onCreate(Bundle savedInstanceState) { 
  
  // TODO Auto-generated method stub 
  
  super.onCreate(savedInstanceState); 
  
  startActivity(new Intent(this,xx.class)); 
  
} 
  

@Override 
  
protected void onNewIntent(Intent intent) { 
  
  // TODO Auto-generated method stub 
  
  super.onNewIntent(intent); 
  
  this.finish(); 
  
} 
  
}

前面我们来先看一下目前网上提供的几种方案:

1.退出单个activity


1)、获取当前进程的id,杀死该进程。

android

.os.Process.killProcess(android.os.Process.myPid())

2)、终止当前正在运行的Java虚拟机方法。System.exit(0); 



3)、finish();


4)、杀包方式。


  ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);   


  manager.restartPackage(getPackageName()); 


  添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;


(在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)



2.退出整个应用(多个Activity)



   以下我直接列出网上给出的几种方案,就不做详细说明了。


1)、制造抛异常导致程序强制退出:



2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity



3)、广播方式:



4)、递归退出


在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。



3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下activity四种模式的概念,因为这个退出方法跟   activity的启动模式有一定的关系;



1)、standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。



2)、singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它(

在重用的这个过程中会调用实例的OnNewIntent()这个方法 ),否则就创建新的Activity实例。


3)、singleTask 模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例(

在重用的这个过程中会调用实例的OnNewIntent()这个方法 )。重用时, 如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈 。如果栈中不存在该实例,将会创建新的实例放入栈中。


4)、singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。



在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中,

刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈 。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成 singleTask  模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……


package com.test.launchmode; 
  
import android.app.Activity; 
  
import android.content.Intent; 
  
import android.os.Bundle; 
  
import android.util.Log; 
  
public class  MainActivity extends Activity { 
  
@Override 
  
protected final void onCreate(Bundle savedInstanceState) { 
  
  // TODO Auto-generated method stub 
  
  super.onCreate(savedInstanceState); 
  
  startActivity(new Intent(this,xx.class)); 
  
} 
  

@Override 
  
protected void onNewIntent(Intent intent) { 
  
  // TODO Auto-generated method stub 
  
  super.onNewIntent(intent); 
  
  this.finish(); 
  
} 
  
}




标签:启动,activity,模式,实例,应用,Activity,Android,android
From: https://blog.51cto.com/u_16112859/6320510

相关文章

  • android 使用多个Intent 进行activity跳转 而没有finish的情况,如何直接退出系统
    <:section><!--列表视图页显示缩略图和文章摘要--><!--文章视图页显示全部内容--><!--如果有内容,显示内容-->就是N个Activity跳转没finish();最后一个Activity单击事件如何推出整个程序?很简单:只要在最后一个需要finish掉之前所有的avtivity的Intent上加上这样一句话......
  • android-card-slide-panel模仿探探首页卡片左右滑动效果,滑动流畅,卡片view无限重生...
    android-card-slide-panel类别: 图像(Image)打分: ★★★★★更新: 2015-12-0312:37大小: 10003kb开发环境: AndroidStudio浏览: 913次下载: 213次项目地址: https://github.com/xmuSistone/android-card-slide-panel图片,手势下载 收藏xmuSistone......
  • Android ContentProvider详解
    一.Android四大组件Android四大组件是Activity,Service,ContentProvider,BroadcastReceiver。Activity作为程序界面,直接与用户交互Service运行在后台,没有界面,完成特定的功能ContentProvider维护应用数据,方便应用本身或其它应用访问BroadcastReceiver提供异步广播消息接收机制,......
  • StackOverView又一个Android 5.0 任务管理器控件。这次这个比上次那个(MaterialRecents
    StackOverView视图布局(ViewLayout)★★★★★2015-09-2120:21147kbAndroidStudio1075次165次https://github.com/Bossyao168/StackOverView卡片,任务下载 收藏 Bossyao168 / StackOverViewacustomwidgetofandroid,liketaskmanagerofandr......
  • 踩坑:nacos启动报错提示需要设置JDK环境 ,报错:ERROR: Please set the JAVA_HOME variabl
    换了个Windows11的新电脑,因为个人工作、学习需要,就重新下载了Nacos并解压使用,结果就踩了个坑,使用下面命令启动Nacos服务端时:startup.cmd-mstandalone直接在黑窗口提示:ERROR:PleasesettheJAVA_HOMEvariableinyourenvironment,Weneedjava(x64)!jdk8orlaterisbet......
  • 【Android】Uri、UriMatcher、ContentUris详解
     1.Uri通用资源标志符(UniversalResourceIdentifier,简称"URI")。Uri代表要操作的数据,Android上可用的每种资源-图像、视频片段等都可以用Uri来表示。 URI一般由三部分组成:访问资源的命名机制。 存放资源的主机名。 资源自身的名称,由路径表示。      Android的Uri由以......
  • Android数据储存之File文件储存数据
     一.存储在内部还是外部?AndroidManifest.xml中manifest标签下有一个属性android:installLocation,用于指定应用程序安装在什么地方,该属性有三个可选值:auto:程序可能被安装在外部存储器上,例如SD卡;但是默认会被安装到手机内存中。当手机内存为空时,程序将被安装到外部存储器上;当程序安......
  • 最快Android模拟器Genymotion的安装
        在这开发Android的一段时间内,一直是使用真机进行测试的,使用过的机子包括华为U8825d,红米,MX3.深知Android的最大问题就是碎片化,就是各种适配问题,甚是头疼。也是一直听说Genymotion的快速与强大,也是亲眼见过别人使用Genymotion,完全把Android自带的AVD碾压的渣都不剩。所以......
  • 4.内核及启动流程和systemd及awk
    总结内核设计流派及特点宏内核(monolithickernel):又称单内核和强内核,unix,Linux吧所有系统服务都放在内核里,所有功能集成于同一个程序,分层实现不同功能。其实Linux在单内核实现了模块化,也就相当于吸收了微内核的优点微内核(microkernel):windows,Solaris,HarmonyOS。简化内核功能,在内核......
  • Android原生工程配置导入uni-app项目-混合开发
    Android原生工程配置官网配网地址:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/androidApp离线SDK下载我这边给大家放在资料里面了新建Android项目Hello-H5注意:Android项目目录不要有中文拷贝[email protected]、lib.5plus.base-release.aar、mi......