【Android】实现微信小游戏关闭后再次打开接着玩,无需重新加载

本文详细解析了微信小游戏如何在关闭后重新打开仍能保留游戏状态的技术实现,主要通过调整Activity的启动模式,如SingleTask和SingleInstance,确保页面不重建并保留资源。同时提供了一个简单的Android demo,演示了在主页面和小游戏页面之间切换而不重新加载的逻辑。通过onNewIntent回调判断游戏状态,实现不同游戏间的切换管理。

现在市面上很多app上都有小游戏(或叫h5游戏),它们借助小游戏来提高整个app的粘性。像微信app、趣头条app、哈啰app上已经出现了小游戏模块。

用户聊天、刷资讯、骑车之余可以打开小游戏休息放松,如果玩游戏时突然间来消息了或者累了想看资讯,关闭游戏页面后,再次打开,一般来说是需要重新加载游戏的,因为游戏关闭后内存资源就被回收了。但是作为游戏来讲,重新加载这种体验就不太好,有可能用户是暂时离开一会儿,再重新加载,不仅加载需要耗时而且之前游戏状态也没了。

那么微信小游戏是如何做到关闭游戏后,重新打开,保留了之前游戏状态,不需要重新加载呢?

我们知道activity关闭后,再次打开肯定要走onCreate生命周期,那么页面相关资源就要重建,这样就得重新加载游戏了。

实际上,微信小游戏关闭页面关不是finish掉了,而且跳转到其它页面了,小游戏页面还在后台运行,游戏也处于暂停状态,相关资源还在内存保留,没有被回收。再次打开同一个游戏,那么就不会再重新加载了。

那么这里面就涉及两个问题。

第一个问题,从游戏页面返回上一个页面或者跳转到其它页面,如何保证目标页面不会重建呢?

这个很简单,把目标页面启动模式设置成SingleTask或者SingleTop就可以了:

  <activity
         android:name="com.devnn.demo.MainActivity"
         android:launchMode="singleTask">
        <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
   </activity>

或者在跳转的Intent上加上标记:clearTop或者singleTop也能达到同样的效果:

     Intent intent = new Intent(this, MainActivity.class);
     intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
     //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
     startActivity(intent);

clearTop类似于SingleTask,是清除目标activity之上的activity来保证目标activity不重建,这个适用于回到主页面。
SginleTop是保证栈顶的activity唯一,这个适用于从一个栈跳转到另一个栈的栈顶页面。(请接着看第二个问题。)

第二个问题,再次回到游戏,如何保证游戏页面不会重建呢?

这个其实也涉及到启动模式知识。将小游戏页面启动模式设置成SingleInstance即可。SingleInstance表示,将activity存在在单独的task栈中,下次再次启动这个activity就直接切换到这个activity。那么两个栈中的页面来回切换就方便自如了。配置如下:

  <activity
            android:name="com.devnn.demo.ActivityA"
            android:launchMode="singleInstance">
  </activity>

从小游戏切回上一个页面,使用startActivity,并且在intent上添加SingleTop标记即可防止栈顶activity重建:

 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

其实SingleInstance的使用场景很罕见,小游戏是一种很典型的场景了。

笔者做了一个demo实现了小游戏这种场景。其中MainActivity是主页面,ActivityA是仿小游戏页面。两个页面互相跳转不会finish页面也不会重建页面。代码如下:

MainActivity.java

package com.devnn.demo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;


public class MainActivity extends AppCompatActivity {
   
   
    priv
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值