以下是我用于在tagmanager的数据层上发送推送事件的所有代码。包括tagmanager的init。
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.tagmanager.ContainerHolder;
import com.google.android.gms.tagmanager.DataLayer;
import com.google.android.gms.tagmanager.TagManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendOpenScreenWithDeviceInfo("HEllo world","hello world", MainActivity.this);
}
});
initTagmanager(this);
}
public static void sendOpenScreenWithDeviceInfo(final String screenName, final String vertical, final Context context) {
DataLayer dataLayer = TagManager.getInstance(context).getDataLayer();
dataLayer.pushEvent("openScreen", DataLayer.mapOf("screenName", screenName));
}
public static void initTagmanager(Context context) {
prepareTagManager(BuildConfig.CONTAINER_ID_1, R.raw.defaultcontainer_binary_1, context);
prepareTagManager(BuildConfig.CONTAINER_ID_2, R.raw.defaultcontainer_binary_2, context);
}
public static void prepareTagManager(String containerName, int rawContainer,final Context context) {
try {
TagManager tagManager = TagManager.getInstance(context);
PendingResult<ContainerHolder> pending =
tagManager.loadContainerPreferNonDefault(containerName,
rawContainer);
} catch (Exception e) {
Log.e("GTM", e.getMessage(), e);
}
}
}
当我按下按钮后,它会打印此日志。
06-11 15:02:34.657 22292 22932 D GAv4 : Hit delivery requested: ht=1497173554549, _s=23, _v=ma9.2.56, a=1556722142, adid=2d68a735-0d98-4e3f-9588-07ade43f9ff6, aid=com.example.sibadityamaiti.myapplication, an=My Application, ate=1, av=1.0, cd=HEllo world, cd11=NA, cd12=NA, cd13=NA, cd14=NA, cd15=NA, cd20=NA, cd6=NA, cd7=NA, cd8=NA, cid=8f3adfc2-2cbe-49c0-b2b3-d3913ff4e5f9, sr=1080x1920, t=appview, tid=UA-36768858-15, uid=NA, ul=en-in, v=1
06-11 15:02:34.672 22292 22932 D GAv4 : Hit delivery requested: ht=1497173554553, _s=23, _v=ma9.2.56, a=1556722143, adid=2d68a735-0d98-4e3f-9588-07ade43f9ff6, aid=com.example.sibadityamaiti.myapplication, an=My Application, ate=1, av=1.0, cd=HEllo world, cd11=NA, cd12=NA, cd13=NA, cd14=NA, cd15=NA, cd20=NA, cd6=NA, cd7=NA, cd8=NA, cid=8f3adfc2-2cbe-49c0-b2b3-d3913ff4e5f9, sr=1080x1920, t=appview, tid=UA-36768858-8, uid=NA, ul=en-in, v=1
06-11 15:02:34.734 22292 22932 D GAv4 : Hit sent to the device AnalyticsService for delivery
06-11 15:02:34.755 22292 22932 D GAv4 : Hit sent to the device AnalyticsService for delivery
日志显示两个事件被触发但是只有一个点击事件。 这可能会导致分析损坏。
这是我正在使用的依赖。
compile 'com.google.android.gms:play-services-tagmanager:9.2.1'
任何帮助将不胜感激。如果有人需要更多信息,请告诉我。
答案 0 :(得分:0)
我们希望找到问题所在。这里没有双数据层推送调用。 这是TagManager lib本身的健壮性问题。
主要问题是。如果为单个应用程序实例调用tagmanager init两次。 TagManager将通过发送双击或三击命令开始行为不端。
在我发布的示例应用中。哪一个活动。 在其onCreate中调用Tag Manager Init。一个按钮。它onclick在数据层上发送一次推送。 新样品容器。即使这个最小设置也能够重现这个错误。
在我们的案例中,我们在Launcher Activity OnCreate中初始化GTM。按下然后再回来。 随着启动器将再次创建。它会再次调用Init。但是对于这种情况,没有重新创建Application实例。
我们的解决方案是将此Init Tag管理器代码移动到Application OnCreate。而是在任何活动中。 在我们的开发测试中。我们现在发现它已修复。
对于Google团队:
tagmanager doc应该提到首选Application类中的TagManager init。而不是任何Activty。如果它已经提到过。 然后我可能会忽略它。它应该突出显示,因为它可以影响产品的GA。
TagManager应该更健壮,可以处理单个应用实例的多个init。