Merge pull request #1647 from NativeScript/cankov/fix-android-background-navigate

Frame.navigate while in background
This commit is contained in:
Panayot Cankov
2016-03-01 16:57:52 +02:00
2 changed files with 45 additions and 6 deletions

View File

@ -127,7 +127,7 @@ function pageFromBuilder(moduleNamePath: string, moduleExports: any): Page {
return page;
}
interface NavigationContext {
export interface NavigationContext {
entry: definition.BackstackEntry;
isBackNavigation: boolean;
}
@ -264,7 +264,7 @@ export class Frame extends CustomLayoutView implements definition.Frame {
//trace.write("calling _updateActionBar on Frame", trace.categories.Navigation);
}
private _processNavigationContext(navigationContext: NavigationContext) {
protected _processNavigationContext(navigationContext: NavigationContext) {
if (navigationContext.isBackNavigation) {
this.performGoBack(navigationContext);
}

View File

@ -1,13 +1,13 @@
import definition = require("ui/frame");
import frameCommon = require("./frame-common");
import pages = require("ui/page");
import transitionModule = require("ui/transition");
import trace = require("trace");
import {View} from "ui/core/view";
import {Observable} from "data/observable";
import trace = require("trace");
import application = require("application");
import * as application from "application";
import * as types from "utils/types";
import * as utils from "utils/utils";
import transitionModule = require("ui/transition");
global.moduleMerge(frameCommon, exports);
@ -348,6 +348,45 @@ export class Frame extends frameCommon.Frame {
return true;
}
protected _processNavigationContext(navigationContext: frameCommon.NavigationContext) {
let activity = this._android.activity;
if (activity) {
let isForegroundActivity = activity === application.android.foregroundActivity;
let isPaused = application.android.paused;
if (activity && !isForegroundActivity || (isForegroundActivity && isPaused)) {
let weakActivity = new WeakRef(activity);
let resume = (args: application.AndroidActivityEventData) => {
let weakActivityInstance = weakActivity.get();
let isCurrent = args.activity === weakActivityInstance;
if (!weakActivityInstance) {
trace.write(`Frame _processNavigationContext: Drop For Activity GC-ed`, trace.categories.Navigation);
unsubscribe();
return
}
if (isCurrent) {
trace.write(`Frame _processNavigationContext: Activity.Resumed, Continue`, trace.categories.Navigation);
super._processNavigationContext(navigationContext);
unsubscribe();
}
}
let unsubscribe = () => {
trace.write(`Frame _processNavigationContext: Unsubscribe from Activity.Resumed`, trace.categories.Navigation);
application.android.off(application.AndroidApplication.activityResumedEvent, resume);
application.android.off(application.AndroidApplication.activityStoppedEvent, unsubscribe);
application.android.off(application.AndroidApplication.activityDestroyedEvent, unsubscribe);
}
trace.write(`Frame._processNavigationContext: Subscribe for Activity.Resumed`, trace.categories.Navigation);
application.android.on(application.AndroidApplication.activityResumedEvent, resume);
application.android.on(application.AndroidApplication.activityStoppedEvent, unsubscribe);
application.android.on(application.AndroidApplication.activityDestroyedEvent, unsubscribe);
return;
}
}
super._processNavigationContext(navigationContext);
}
}
var framesCounter = 0;
@ -433,7 +472,7 @@ class AndroidFrame extends Observable implements definition.AndroidFrame {
return activity;
}
}
return undefined;
}