`
carywei
  • 浏览: 191243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

不同的方式启动一个应用,解决不重复启动相同的Activity的方式

阅读更多

编写:徐建祥(netpirate@gmail.com)

日期:2010/12/13

网址:http://www.anymobile.org

打开程序的入口有很多个:

shell 命令行运行;

Launcher待机界面执行;

状态通知栏运行;

桌面快捷方式运行;

软件中调用运行;

安装软件后执行“OPEN”运行!

前面几项,调用程序的代码如下(参考:com.android.Launcher/.Launcher.java):

 

  1. Intent intent = new Intent(this, TestActivity.class);  
  2. intent.setAction(Intent.ACTION_MAIN);  
  3. intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  4. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  5. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  6. this.startActivity(intent);  
 

 

而安装软件后,点击“Open”调用的代码如下(参考:com.android.packageinstaller/.InstallAppDone.java):

 

  1. Intent intent = new Intent(this, TestActivity.class);  
  2. this.startActivity(intent);  
 

 

如果用户安装软件后立刻执行“Open”,运行程序后,按HOME键返回到后台,然后再通过别的几种方法运行程序,则会再起一个MAIN程序。这是因为Intent的处理机制是,先比较Activity,再比较Action、Flag、bnds。。。,前后两张方式的Action不一样,一个有LAUNCHER ACTION,一个没有,所以会认为是启动两个不同的INTENT。

目前只想到一个简单的处理方式:

程序入口MAIN程序:SplashActivity.java

程序原入口程序:LoginActivity.java

启动程序后,在状态通知栏上添加快捷通知,代码如下:

 

  1. package org.anymobile.test;  
  2. import android.app.Activity;  
  3. import android.app.Notification;  
  4. import android.app.NotificationManager;  
  5. import android.app.PendingIntent;  
  6. import android.content.ComponentName;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. public class SplashActivity extends Activity  
  11. {  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState)  
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.           
  17.         this.showNotification(this.getBaseContext(), -1"Test is Running!""Test Start Up!");  
  18.           
  19.         Intent intent = this.getIntent();  
  20.         if (intent.hasCategory(Intent.CATEGORY_LAUNCHER))  
  21.         {  
  22.             intent = new Intent(this, TestActivity.class);  
  23.             this.startActivity(intent);  
  24.         }  
  25.         else  
  26.         {  
  27.             intent = new Intent();  
  28.             ComponentName componentName = new ComponentName(this, SplashActivity.class);  
  29.             intent.setComponent(componentName);  
  30. //          intent = new Intent(this, SplashActivity.class);  
  31.               
  32.             intent.setAction(Intent.ACTION_MAIN);  
  33.             intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  34.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  35.             intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  36.               
  37.             this.startActivity(intent);  
  38.         }  
  39.           
  40.         this.finish();  
  41.     }  
  42.     public void showNotification(Context context,int iResIcon,String sNotifybar,String sNofitymsg)  
  43.     {  
  44.         // look up the notification manager service  
  45.         NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);  
  46.         // The details of our fake message  
  47.         CharSequence from = "Test";  
  48.         CharSequence message = sNofitymsg;  
  49.           
  50.         Intent intent = new Intent();  
  51.         ComponentName componentName = new ComponentName(context, TestActivity.class);  
  52.         intent.setComponent(componentName);  
  53.           
  54.         intent.setAction(Intent.ACTION_MAIN);  
  55.         intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  56.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  57.         intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  58.           
  59.         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);  
  60.         Notification notification =   
  61.             new Notification(iResIcon,sNotifybar, System.currentTimeMillis());  
  62.         notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;  
  63.         notification.defaults =   
  64.             /*Notification.DEFAULT_SOUND|*/Notification.DEFAULT_LIGHTS;  
  65.         notification.setLatestEventInfo(context, from, message, contentIntent);  
  66. line-height: 18px; color: black; background-co
    分享到:
    评论
    3 楼 anjxue 2011-12-01  
    使用singleInstance这个方法太草率了。
    比如我们的根activity为A,给A设置singleInstance.
    当只有一个A时没有问题,但当A上面有其它Activity时,就有问题的,比如A上面有B,C
    这样当按home切回桌面,再次点击应用程序图标时,程序又返回到A而不是C!
    显然通常情况下我们想要回到C的。

    我也在寻找合适的解决办法。
    2 楼 guoying245 2011-10-20  
    lasttimes 写道
    可以尝试在AndroidManifest.xml文件中的启动activity一项中加入参数
    android:launchMode="singleInstance"

    试试。

    谢谢,管用
    1 楼 lasttimes 2011-08-24  
    可以尝试在AndroidManifest.xml文件中的启动activity一项中加入参数
    android:launchMode="singleInstance"

    试试。

相关推荐

    Android receiver 多次启动相同Activity

    在某些情况下,这可以避免重复启动Activity,但请注意,Sticky Broadcast在Android 8.0(API级别26)及以上版本已被废弃。 5. **合理使用Intent Filter**:限制BroadcastReceiver接收的Intent Filter范围,减少不必...

    activity的启动方式

    这意味着每次启动Activity,栈中都会有一个新的实例,可能导致内存消耗增加。 2. **单任务模式(SingleTask)** 单任务模式下,系统会确保该Activity在其自己的任务栈中运行。首次启动时,系统会创建一个新的任务...

    Activity四种启动模式

    这种模式常用于避免重复创建Activity,比如通知或者广播接收器启动Activity时。 Eclipse代码验证这部分知识时,可以创建四个不同的Activity,分别为每种启动模式设置一个,并编写相应的启动逻辑。例如,可以通过...

    Android应用Activity启动环研究.pdf

    然而,当前的 Activity 跳转分析方法对启动方式不敏感,无法正确模拟使用特殊启动方式的 Android 应用返回栈状态变化,从而产生非法路径。 本文提出了一个形式化的 Activity 启动图(Activity Launch Graph,ALG)...

    收到广播后启动一个应用程序

    启动Activity时,我们通常会创建一个Intent对象,并指定目标Activity。例如: ```java Intent intent = new Intent(this, TargetActivity.class); ``` Intent标志对于Activity的启动方式有着重要影响。以下是一些...

    Activity启动和退出动画

    总的来说,为Activity创建启动和退出动画是提高应用吸引力和用户体验的有效方式。理解Android动画系统的工作原理,结合XML动画资源和Java代码,我们可以实现各种各样的动画效果,包括从右侧进入和退出的动画。记住,...

    Android Activity设置相同的action进行判断源码.rar

    尽管Activity可以直接处理Intent,但也可以注册BroadcastReceiver监听特定Action的Intent,然后根据Intent的内容决定是否启动Activity或执行其他操作。 通过这个源码,开发者可以深入理解如何在多个Activity间共享...

    同一个APK多个icon进入同一个Activity的不同tab页

    在Android开发中,有时我们需要一个APK支持多个入口点,每个入口点对应不同的功能或界面,比如同一个应用可以通过不同的图标进入不同的Tab页。这个需求在一些常驻应用中尤为常见,比如电话本应用,用户可能希望通过...

    动画启动Activity

    "动画启动Activity"是一个关于如何为应用程序的Activity添加各种进入动画效果的专题,非常适合初级到中级水平的开发者进行学习和实践。这个专题主要涉及到Android中的视图动画(View Animation)和属性动画...

    android 判断应用是否第一次启动

    在启动应用的第一个Activity时,可以检查Intent是否有特定的Extra数据,如果没有,视为第一次启动。 以上就是判断Android应用是否第一次启动的常见方法,通常首选SharedPreferences,因为它简单且效率高。在实际...

    ActivityGroup应用-如何把一个Activity加载成一个视图

    Fragment和FragmentTransaction提供了更好的解决方案,它们可以在单个Activity中管理多个视图,并且支持更复杂的应用场景。如果需要处理遗留代码或对ActivityGroup有深入了解的需求,以上内容将为你提供基础的指导。

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    这对于需要启动一个独立于当前应用的 Activity 场景非常有用。 #### 三、启动模式示例及实践 假设我们有一个应用 AppA,包含 AfirstActivity 和 AsecondActivity。在默认情况下,这两个 Activity 都将以 `standard...

    Activity启动模式

    每次启动Activity时,不论栈中是否存在该Activity的实例,系统都会创建一个新的实例,并将其压入任务栈顶。这意味着,同一个Activity可以在任务栈中存在多个实例。 2. **单实例模式(SingleInstance)**:在这种...

    【Android进阶】(6)Activity启动模式和窗口导航

    在Android应用开发中,Activity是用户界面的基本单元,它的启动模式和窗口导航是理解应用程序行为和用户体验设计的关键。本文将深入探讨Activity的四种启动模式——Standard、SingleTop、SingleTask和SingleInstance...

    避免HOME键重复启动launcher

    标题中的“避免HOME键重复启动launcher”涉及到的是Android操作系统中关于Home键的处理以及应用程序启动管理的问题。在Android系统中,Home键是用户用来返回主屏幕的重要交互元素,但有时在开发特定应用如锁屏应用时...

    android点击按钮实现多个Activity滑动切换

    如果需要在整个应用中保持一致性,可以考虑将动画设置封装到一个公共的基类Activity中,然后让其他所有Activity继承这个基类,这样就不需要在每个Activity中重复设置动画。 通过以上步骤,我们就实现了点击按钮时...

    android实现APP应用引导页&启动页的功能源代码

    1. 创建启动页布局:一个简单的Activity布局,通常包含应用Logo和背景色。 2. 主Activity延迟启动:在AndroidManifest.xml中设置启动页Activity为主Activity,并在启动页Activity中延迟启动真正的主Activity。 3. ...

    Android启动模式

    每次启动Activity时,系统都会创建一个新的实例,并将其压入任务栈的顶部。如果任务栈中已有该Activity的实例,那么会创建一个新的实例并添加到栈中。这种模式可能导致多个相同的Activity实例存在于不同的任务栈或者...

    启动模式实例

    在这种模式下,每次启动Activity时都会创建一个新的实例。无论启动请求来自哪里,系统都会为每个请求创建一个新的Activity实例。如果栈中已经存在该Activity的实例,也会创建新的实例并压入栈顶。 2. **单例模式...

Global site tag (gtag.js) - Google Analytics