【问题标题】:Is there a way to make my app activity go back to foreground after users inactivity?有没有办法让我的应用活动在用户不活动后回到前台?
【发布时间】:2019-02-12 13:59:39
【问题描述】:

作为一名 Unity3D 开发人员,我创建了一个应用程序并将其导出到 Android Studio。我的客户要求我在用户不活动 10 秒后让这个应用程序回到前台(以防用户打开另一个应用程序)。我试图创建一个在我的 UnityPlayerActivity 的 OnPause 函数上启动的服务。然后该服务将检测用户的不活动并再次启动我的应用程序(将其放回前台)。首先,无论如何,我只尝试使用 Time.Schedule 在 10 秒后启动我的应用程序,但每次应用程序暂停(进入后台)时,它都会启动服务然后崩溃。问题是:有没有一种简单的方法可以做到这一点?我不是 Android Java 开发人员(只知道基础知识),我在这部分苦苦挣扎。

我正在尝试创建此服务,然后尝试从我的活动中的 onPause() 函数启动它。当我暂停手机上的应用程序时,应用程序崩溃。谁能告诉我我的方法是否正确,请帮助我?

public class ReturnToForeground extends Service {
    public ReturnToForeground() {
    }

    // constant
    public static final long NOTIFY_INTERVAL = 10 * 1000; // 10 seconds

    // run on another Thread to avoid crash
    private Handler mHandler = new Handler();
    // timer handling
    private Timer mTimer = null;
    Intent intent = new Intent(this, UnityPlayerActivity.class);
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // cancel if already existed
        if (mTimer != null) {
            mTimer.cancel();
        } else {
            // recreate new
            mTimer = new Timer();
        }
        // schedule task
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
        return super.onStartCommand(intent, flags, startId);
    }

    class TimeDisplayTimerTask extends TimerTask {

        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                    // do action
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setAction(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_LAUNCHER);
                    startActivity(intent);
                }

            });
        }
    }
}

【问题讨论】:

  • 为了明确,您正在寻求一种在用户离开应用十秒钟时强制用户返回您的应用的方法,并且您想统一执行此操作?
  • 嗨。不完全是。如果他十秒钟不使用手机,我想“强制”用户回到我的应用程序。我知道我必须使用服务来执行此操作,但我不想使用 Unity 执行此操作,我正在尝试使用 Android Studio(尽管我不是 Java 开发人员)。我不会把这个应用放到游戏商店,当然,这只是给我的客户,他是唯一会使用这个的人。我想知道如何在不使应用崩溃的情况下使该服务正常运行。
  • My client is asking me to make this app go back to foreground after 10 seconds of user's inactivity (in case the user opens another app 这听起来像是一个非常讨厌的垃圾邮件,我作为用户不想在这里支持......或者是试图创建一个自定义电话储物柜?首先,两者都与 Unity 没有太大关系..
  • @derHugo ahahahaha 不,这不是垃圾邮件。我的应用程序具有增强现实体验,将在某些销售点运行。正如你所说,它更像是一个定制的手机储物柜。该应用程序一直播放视频,当用户拿起手机时,它会启动 AR 体验,如果用户停止使用手机,它会返回视频,但如果用户打开另一个应用程序然后停止使用手机,我的应用程序10 秒后回到前台。

标签: java c# android unity3d service


【解决方案1】:

为应用程序在 onPause() 中的时间设置一个计时器,当计时器达到 10 秒时,您应该传递一个意图,这将使您的应用程序再次处于活动状态(假设将用户带回主视图)。您可以将应用的当前数据保存在共享首选项中,这样在大多数情况下信息都不会丢失。

在许多情况下,当您尝试重新加载的资源在应用程序中不再处于活动状态时,就会出现此问题。

从您分享的信息来看,您似乎没有正确启动服务。如果您可以添加崩溃日志以便我们可以调试它并查看问题所在,那就太好了。

【讨论】:

  • 哦,所以 OnPause() 函数在应用程序处于后台时继续运行?我以为它只被调用一次。所以我把这个计时器放在 onPause() 函数本身而不是服务代码里面?
  • 实际上不,你是对的,但是你可以有一个变通方法,你有一个为此活动产生的威胁,它暂停的那一刻,哪个线程将计算秒数,当它完成时你将过渡到您的应用程序,并终止线程:) 对不起我在上面的答案中的错误
  • 哈哈哈没问题!!我怎样才能开始这个线程?我试图创建一个服务,我的活动从 onPause() 函数开始。我的服务有一个 Timer.Schedule 应该在 10 秒内启动 UnityPlayerActivity(我的应用程序)。但是 - 我不知道为什么 - 这会使应用程序崩溃。
  • 像通常创建线程一样启动它。像这样杀死它 protected void onPause() { handler.removeCallbacks(runnable);超级.onPause(); }
  • 即使应用程序在后台,线程仍然运行?好的,我试试这个
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2012-12-28
  • 2020-11-13
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多