1

我有一个小代码可以在第一次运行时向主屏幕添加快捷方式:

    Intent shortcutIntent = new Intent(getApplicationContext(),
            SFlashActivity.class);

    shortcutIntent.setAction(Intent.ACTION_MAIN);

    Intent addIntent = new Intent();
    addIntent
            .putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "New App");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
            Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                    R.drawable.ic_launcher));

    addIntent
            .setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    addIntent
            .putExtra("duplicate", false);
    getApplicationContext().sendBroadcast(addIntent);

但是使用上面的代码,尽管我的应用程序正在运行,但我的应用程序总是启动启动画面。那么我怎样才能让主屏幕快捷方式恢复到顶部活动。我注意到,谷歌在安装时制作的应用程序快捷方式总是恢复顶部活动。

非常感谢 !

4

3 回答 3

2

使用 isTaskRoot() 方法 在主要活动的 OnCreate() 中输入以下代码片段这是一个示例:


 @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        setContentView(R.layout.splashscreen);              
        if(!isTaskRoot()){
            finish();
            return; 
        }
 }

在这里找到解决方案:

于 2014-04-29T11:53:08.710 回答
1

当通过主屏幕上的图标启动时,Android 将始终使用android.intent.action.MAIN您的过滤器启动活动AndroidManifest.xml,除非应用程序已经在运行(在这种情况下,它显然会在堆栈顶部恢复活动)。

要实现您所描述的,您可以简单地将最后一个可见活动存储在其中,SharedPreferences并拥有一个Dispatcher活动,该活动根据偏好启动最后一个活动。

因此,如果首选项中存在活动,则启动该活动或启动 SplashScreen。

在您想要自动重新开始的每个活动中:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("lastActivity", getClass().getName());
    editor.commit();
}

以及类似于以下内容的Dispatcher活动:

public class Dispatcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Class<?> activityClass;

        try {
            SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
            activityClass = Class.forName(
                prefs.getString("lastActivity", SplashScreen.class.getName()));
        } catch(ClassNotFoundException ex) {
            activityClass = SplashScreen.class;
        }


        startActivity(new Intent(this, activityClass));
    }
}

评论

  • onPause您可以为覆盖创建一个基类
  • Dispatcher活动显然需要作为android.intent.action.MAIN动作

Ref : -重新启动时如何使 android 应用程序返回到上次打开的活动?

于 2013-06-12T06:08:36.550 回答
0

由于按下 Home 按钮,当应用程序在后台返回时,我也遇到了同样的问题,即恢复应用程序,

两个改变

1.将以下属性添加到清单文件中的活动

android:alwaysRetainTaskState="true" 

当来自启动器图标时,这将恢复活动。

2.如果您单击以编程方式创建的主屏幕上的应用程序图标,则上部更改不会恢复应用程序。因为您已经为启动目的指定了“SFlashActivity.class”。要克服这个问题,您必须采取以下技巧:

将此函数添加到您的 SFlashActivity.class

public boolean CheckIfAppIsResumable(){
    try{
         ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
         List<RunningTaskInfo> runningTaskInfoList =  am.getRunningTasks(1);
         Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator();
         while(itr.hasNext()){
             RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next();
             CharSequence desc= runningTaskInfo.description;
             int numOfActivities = runningTaskInfo.numActivities;
             int numRunning=runningTaskInfo.numRunning;
             String topActivity = runningTaskInfo.topActivity.getClassName();
             Log.d("description", ""+desc);
             Log.d("numActivities", ""+numOfActivities);
             Log.d("numRunning", ""+numRunning);
             Log.d("topActivity", ""+topActivity);
             if(numRunning>1 && topActivity.equalsIgnoreCase("com.yourpackage.yoursplashclass"))
                 return true;
         }
         return false;
    }
    catch(Exception e){
        Log.d("Errror CheckIsAppIsResumable=", ""+e.getMessage());
        return false;
    }
}

在 Oncreate 中:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    if(CheckIfAppIsResumable()){
        finish();
        return;//will finish the new started splash activity
    }

前提是您的快捷方式意图没有标志 FLAG_ACTIVITY_CLEAR_TOP。

于 2014-01-25T08:47:05.847 回答