Firebase Dynamic Link, Clear It After Using Once
Solution 1:
Duplicate the code written in MainActivity:onCreate
method (entire Firebase Dynamic Links related code) inside MainActivity:onNewIntent
method, this works irrespective of the app is running in the background or not.
Also MainActivity:onNewIntent
method is not invoked if the app is not present in background hence no duplicate Firebase call happens.
Your MainActivity should look like this
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
//...FirebaseDynamicLinks.getInstance()
.getDynamicLink(getIntent())
.addOnSuccessListener(this, newOnSuccessListener<PendingDynamicLinkData>() {
@OverridepublicvoidonSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
// Get deep link from result (may be null if no link is found)Uri deepLink = null;
if (pendingDynamicLinkData != null) {
deepLink = pendingDynamicLinkData.getLink();
}
// Handle the deep link. For example, open the linked// content, or apply promotional credit to the user's// account.// ...
})
.addOnFailureListener(this, newOnFailureListener() {
@OverridepublicvoidonFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
}
@OverrideprotectedvoidonNewIntent(Intent intent) {
//...FirebaseDynamicLinks.getInstance()
.getDynamicLink(intent)
.addOnSuccessListener(this, newOnSuccessListener<PendingDynamicLinkData>() {
@OverridepublicvoidonSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
// Get deep link from result (may be null if no link is found)Uri deepLink = null;
if (pendingDynamicLinkData != null) {
deepLink = pendingDynamicLinkData.getLink();
}
// Handle the deep link. For example, open the linked// content, or apply promotional credit to the user's// account.// ...
})
.addOnFailureListener(this, newOnFailureListener() {
@OverridepublicvoidonFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
}
Solution 2:
I kept a dirty hack by taking a global url and comparing it next time with new url , It's not perfect but it's the best I came up with .
varpreviousDeepLink:String?=null//take it as global and staticFirebaseDynamicLinks.getInstance()
.getDynamicLink(getIntent())
.addOnSuccessListener(this, newOnSuccessListener<PendingDynamicLinkData>() {
@OverridepublicvoidonSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
// Get deep link from result (may be null if no link is found)Uri deepLink = null;
if (pendingDynamicLinkData != null) {
deepLink = pendingDynamicLinkData.getLink();
}
if(previousDeepLink==deepLink?.toString()){
return@OnSuccessListener
}
previousDeepLink=deepLink?.toString()
// Handle the deep link. For example, open the linked// content, or apply promotional credit to the user's// account.// ...// ...
}
})
.addOnFailureListener(this, newOnFailureListener() {
@OverridepublicvoidonFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
Solution 3:
The answer is in the documents:
You must call getDynamicLink() in every activity that might be launched by the link, even though the link might be available from the intent using getIntent().getData(). Calling getDynamicLink() retrieves the link and clears that data so it is only processed once by your app.
You normally call getDynamicLink() in the main activity as well as any activities launched by intent filters that match the link.
Post a Comment for "Firebase Dynamic Link, Clear It After Using Once"