라이브 앱을 위한 앱 수명 주기 관리

Windows 8 앱 개발자 블로그

Windows 8 엔지니어링 팀에서 제공하는 Windows 8용 Metro 스타일 앱 개발의 이해

라이브 앱을 위한 앱 수명 주기 관리

  • Comments 0

Windows 8에서 선보이는 앱 수명 주기 모델로 인해 사용자는 더 이상 실행 중인 앱을 관리하지 않아도 됩니다. 이 모델은 개발자에게도 도움이 됩니다. 개발자는 앱이 백그라운드에 있는 동안 장치의 배터리 또는 성능에 영향을 주지 않는 뛰어난 사용자 경험을 손쉽게 구성할 수 있습니다. 새로운 수명 주기 이벤트를 사용하면 앱이 화면에 표시되지 않는 경우에는 실행되지 않고 있는 것임에도 불구하고 사용자는 앱이 항상 실행되는 것 같은 느낌을 받게 됩니다.

오늘날 랩톱, 태블릿 및 휴대폰의 배터리가 너무 빨리 소모되는 경향이 있는데, 이는 사용하지 않을 때에도 앱이 실행되기 때문입니다. 대부분 사용자 편의성 및 앱 간의 신속한 전환을 위해 이렇게 합니다.

우리는 이 점을 염두에 두고 Windows 8의 Metro 스타일 앱에 대한 수명 주기 모델을 개발할 때 앱의 응답을 유지하고, 배터리 소모를 줄이고, 지속적으로 뛰어난 성능을 제공하는 데 집중했습니다. Metro 스타일 앱은 거의 모두 몰입도가 뛰어난 전체 화면 크기의 경험을 제공합니다. 따라서 Windows 8의 새로운 수명 주기 모델은 포그라운드에 있는 앱에 중점을 두어 사용자가 활발하게 앱을 관리하고 장치의 최대 전원을 사용할 수 있도록 하였습니다. 이 글에서는 수명 주기 모델의 새로운 상태 및 뛰어난 앱을 만들기 위해 해야 할 일에 대해 살펴봅니다.

Metro 스타일 앱 수명 주기

Metro 스타일 앱은 주어진 시간 안에 네 가지 수명 주기 상태 중 하나, 즉 not running, running, suspended 또는 terminated 상태에 있게 됩니다. 앱의 상태가 전환되면 사용자에게 일관성 있고 뛰어난 성능을 제공하는 데 유용한 수명 주기 이벤트가 제공됩니다.

아래 다이어그램에서는 Metro 스타일 앱의 상태 전환 방식을 보여 줍니다.

사이에 원형 패턴의 화살표가 있는 세 개의 상자. Not running > activating > running > suspending > suspended > terminating > not running.

모든 Metro 스타일 앱은 사용자가 앱을 시작하고 앱 간에 전환하고 앱을 닫을 때 이러한 상태로 전환됩니다. 사용자가 앱 간에 전환할 때 앱이 running 상태와 suspended 상태를 자주 전환할 수 있습니다. 따라서 앱에서 수명 주기 이벤트를 처리해야 합니다.

앱이 수명 주기 상태 간에 전환하면 다음과 같은 수명 주기 이벤트가 제공됩니다.

이벤트 시작

activated

not running

running

suspending 또는 checkpoint(WinJS)

running

suspended

resuming

suspended

running

일시 중단

일반적으로 Metro 스타일 앱은 사용자가 다른 앱으로 전환할 때 실행을 중지합니다. Windows는 앱이 포그라운드에 있지 않을 때 앱을 일시 중단합니다. 앱이 일시 중단된 경우에는 해당 앱의 메모리 사용률이 변화하지 않게 됩니다. 이 상태에서는 앱이 실행될 수 없지만 사용자가 앱으로 돌아오는 즉시 Windows에서 앱을 다시 시작할 수 있습니다. 이러한 방식으로 Windows에서는 포그라운드 앱에 더 나은 시스템 리소스 사용을 제공하고 앱이 백그라운드 상태에서 배터리를 소모하지 않도록 합니다.

앱이 포그라운드에서 이동한 경우 Windows는 앱으로 다시 신속하게 전환할 수 있도록 몇 초간 기다린 다음 앱을 일시 중단합니다. 앱은 Windows에서 해당 앱을 일시 중단하려는 경우에 수신되는 suspending 또는 checkpoint(JavaScript) 이벤트에 등록되어야 합니다. 이는 앱에 있어 중요한 시간입니다. 이 기회를 통해 영구 저장소에 보관해야 하는 앱 데이터를 저장할 수 있습니다. 일반적으로 앱은 현재 상태 그대로 다시 시작되며 여전히 메모리에 있으므로 영구 데이터가 필요 없습니다. 그러나 Windows에서 시스템 리소스를 확보하기 위해 앱을 종료할 경우에 대비해 이 데이터를 저장해둬야 합니다. 사용자가 앱이 일시 중단된 위치에서 앱을 다시 시작할 수 있도록 충분히 많은 앱 데이터를 저장하는 것이 좋습니다. 그러면 여러분의 고객은 앱이 항상 작동하고 실행 중인 것으로 인식하게 됩니다.

앱이 suspending 이벤트가 수신된 후 5초 이내에 suspending 이벤트 처리기에서 복귀하지 않는 경우 Windows는 앱을 종료합니다. 따라서 suspending 이벤트 처리기에서 부하가 큰 작업을 수행하지 않도록 해야 합니다. 앱 데이터를 저장하고 신속하게 복귀하십시오.

이 글에서는 주식 앱을 예로 들어 보겠습니다. 이 앱은 suspending 이벤트를 사용하여 사용자가 마지막으로 본 주식과 주식 차트의 시간 범위를 저장합니다. 그런 다음 앱이 종료되면 사용자가 앱을 마지막으로 본 시간에 표시된 것과 정확히 같은 보기에서 앱이 다시 시작될 수 있습니다. 예를 들어 주식 앱에서는 Windows가 앱을 일시 중단하기 전에 앱 타일을 최신 정보로 업데이트 할 수 있도록 로컬 타일 알림을 보내는 또 다른 기회로 이를 사용하는 것이 좋습니다.

JavaScript에서의 일시 중단 처리

WinJS(JavaScript용 Windows 라이브러리)를 사용하여 Metro 스타일 앱을 작성하는 경우 checkpoint 이벤트를 사용하여 일시 중단을 처리할 수 있습니다.

var app = WinJS.Application;

function checkpointHandler() {
// The checkpoint event gives us the chance to save application data.
// In this case, we save the current stock info that the user is viewing.
app.sessionState.lastSeenStock = selectedStock;
app.sessionState.lastSeenRange = selectedRange;

// Send client side notifications
Tile.sendTileUpdate(selectedStock, stockInfo.change, stockInfo.lastSale,
stockInfo.lastSaleTime, stockInfo.open);
}

app.addEventListener("checkpoint", checkpointHandler);

이는 간단한 소개에 불과합니다. 자세한 내용은 개발자 센터에서 앱을 일시 중단하는 방법(JavaScript 및 HTML)을 참조하십시오.

XAML에서의 일시 중단 처리

XAML 및 C#을 사용하여 Metro 스타일 앱을 작성하는 경우 응용 프로그램 개체에 대한 Suspending 이벤트를 사용하여 앱 일시 중단을 처리할 수 있습니다.

public App()
{
InitializeComponent();
this.Suspending += new SuspendingEventHandler(OnSuspending);
}

async protected void OnSuspending(object sender, SuspendingEventArgs args)
{
// The Suspending event gives us the chance to save application state
// In this case, we save the current stock info that the user is viewing

// Because writing to a file is asynchronous, we grab a deferral which ensures
// that suspending doesn’t complete until our file write is complete
SuspendingDeferral deferral = args.SuspendingOperation.GetDeferral();

// Here we create a SuspensionManager class which handles adding session data
// to a Dictionary and then serializing that data to a file
SuspensionManager.SessionState["lastSeenStock"] = stock;
SuspensionManager.SessionState["lastSeenRange"] = range;
await SuspensionManager.SaveAsync();

// Send client side notifications
Tile.SendTileUpdate(stock, stockInfo.Change, stockInfo.LastSale,
stockInfo.LastSaleTime, stockInfo.Open);

deferral.Complete();
}

이 역시 마찬가지로 간단한 소개에 불과합니다. XAML 및 C#에서 일시 중단을 처리하는 방법에 대한 자세한 내용은 개발자 센터에서 앱을 일시 중단하는 방법(VB/C#/C++ 및 XAML)을 참조하십시오.

다시 시작

앱이 다시 시작된 경우 Windows에서 해당 앱을 일시 중단한 시점의 상태에서 계속됩니다. 구체적으로 설명하면, 앱이 일시 중단된 동안 앱 데이터 및 상태가 메모리에 유지되므로 다시 시작된 경우 모든 항목이 앱이 일시 중단된 시점 그대로 유지됩니다. 따라서 resuming 이벤트가 수신될 때 저장된 데이터를 명시적으로 복원할 필요가 없습니다.

그러나 앱이 항상 작동 중인 것처럼 보이게 하고 싶다면 연결된 상태를 유지하고 최신 데이터를 표시해야 합니다. 앱이 다시 시작되기 전에 꽤 오랫동안 일시 중단된 상태로 유지될 수 있습니다. 이 경우 데이터 또는 네트워크 연결이 오래 되어 앱이 다시 시작되면 새로 고쳐야 할 수 있습니다. 사용자가 앱을 다시 포그라운드로 가져온 경우 앱에 resuming 이벤트가 수신됩니다. 앱에서 이 이벤트를 받은 경우 앱 콘텐츠를 새로 고치고 네트워크 리소스를 다시 연결할 수 있습니다.

이 글의 주식 앱 예에서는 다시 시작 시 앱이 일시 중단된 당시에 캐시된 모든 주식 데이터가 새로 고쳐집니다. 이전 데이터는 몇 시간 또는 며칠이 지난 데이터일 수 있습니다. 사용자가 이러한 오래된 데이터를 보게 되면 앱이 항상 실행되고 있는 것이 아님을 깨닫게 됩니다. 다시 시작 시 주식 앱은 해당 데이터를 모두 업데이트해야 합니다. 이렇게 하면 사용자가 앱을 포그라운드로 가져올 때마다 최신 주가, 차트 및 뉴스 기사가 표시됩니다.

JavaScript에서의 다시 시작 처리

JavaScript에서는 Windows.UI.WebUI.WebUIApplication 네임스페이스에서 Windows 런타임 resuming 이벤트를 사용할 수 있습니다. 이는 JavaScript 앱에만 사용되는 전문화된 resuming 이벤트입니다.

function resumingHandler() {
//Update the selected stock with the latest news, stock info, and chart data
News.requestNews(stock);
Api.getStockInfoData(stock).then(function(data){displayStockInfo(data); });
Api.getHistoryData(range).then(function (chartData)
{CanvasChart.drawChart("chartCanvas", chartData, Chart.getChartOptions(false));});

// Send client side notifications
Tile.sendTileUpdate(stock, stockInfo.change, stockInfo.lastSale,
stockInfo.lastSaleTime, stockInfo.open);
}

Windows.UI.WebUI.WebUIApplication.addEventListener("resuming", resumingHandler);

자세한 내용은 개발자 센터에서 앱을 다시 시작하는 방법(JavaScript 및 HTML)을 참조하십시오.

XAML에서의 다시 시작 처리

XAML 및 C#을 사용하여 Metro 스타일 앱을 작성하는 경우 응용 프로그램 개체에 대한 Resuming 이벤트를 사용하여 앱 다시 시작을 처리할 수 있습니다.

public App()
{
InitializeComponent();
this.Resuming += new EventHandler<object>(App_Resuming);
}

async private void App_Resuming(object sender, object e)
{
//Update the selected stock with the latest news, stock info, and chart data
News.RequestNews(stock);

Data data = await Api.GetStockInfoDataAsync(stock);
Api.DisplayStockInfo(data);

Chart chartData = await Api.GetHistoryDataAsync(range);
CanvasChart.DrawChart("chartCanvas", chartData, Chart.GetChartOptions(false));

// Send client side notifications
Tile.SendTileUpdate(stock, stockInfo.Change, stockInfo.LastSale, stockInfo.LastSaleTime, stockInfo.Open);
}

VB/C#/C++ 및 XAML에서 다시 시작을 처리하는 방법에 대한 자세한 내용은 개발자 센터에서 앱을 다시 시작하는 방법(VB/C#/C++ 및 XAML)을 참조하십시오.

활성화

활성화는 앱을 시작하는 방법으로, Metro 스타일 앱에서는 여러 용도로 사용됩니다. Metro 스타일 앱 활성화를 사용하여 계약을 처리하는 방법에 대한 자세한 내용은 이전 글인 앱에서 Windows 8 계약 활성화하기를 참조하십시오. 이 글에서는 Windows에서 앱을 종료한 후 사용자가 다시 시작한 경우 활성화를 사용하여 이전에 저장된 데이터를 복원하는 방법에 중점을 둡니다.

앱이 일시 중단된 후 여러 가지 이유로 Windows에서 앱을 종료할 수 있습니다. 예를 들어 사용자가 앱을 수동으로 닫거나 로그아웃한 경우 또는 시스템에서 실행 중인 리소스가 부족한 경우(게임과 같은 일부 앱은 리소스를 굉장히 많이 사용할 수 있음)에 앱을 종료할 수 있습니다. Windows에서 앱을 종료한 후 사용자가 시작한 경우 activated 이벤트가 수신되고 앱이 활성화될 때까지 앱의 시작 화면이 표시됩니다. 이 이벤트를 사용하여 앱에서 마지막으로 일시 중단된 당시에 저장된 데이터를 복원해야 하는지 여부 또는 앱의 기본 데이터를 로드해야 하는지 여부를 확인할 수 있습니다. activated 이벤트 인수에는 활성화되기 전의 앱 상태를 알려 주는 PreviousExecutionState 속성이 포함되어 있습니다. 이 속성은 Windows.ApplicationModel.Activation.ApplicationExecutionState 열거 값 중 하나입니다.

종료 이유 PreviousExecutionState 값 수행할 작업
시스템의 의해 종료됨(리소스 제약, 시스템 종료, 재부팅 등)

Terminated

세션 데이터 복원

사용자가 닫음

ClosedByUser

기본 데이터로 시작

          예기치 않게 종료되거나 사용자 세션이 시작된 이후에 앱이 실행되지 않음

NotRunning

기본 데이터로 시작

PreviousExecutionState 값은 Running 또는 Suspended일 수도 있습니다. 하지만 이러한 경우에는 앱이 이전에 종료되지 않았으므로 데이터를 복원할 필요가 없습니다.

앱이 활성화되고 해당 PreviousExecutionStateTerminated인 경우 사용자가 마지막으로 본 당시의 상태로 앱이 표시되도록 하려면 저장된 세션 데이터를 복원해야 합니다. 사용자가 앱을 수동으로 닫았거나, 앱이 예기치 않게 종료되었거나, 현재 세션이 앱이 실행된 적이 없는 경우에는 이전 세션 데이터를 무시하고 해당 기본 보기로 앱을 시작해야 합니다.

우리의 주식 앱 예에서는 activated 이벤트를 사용하여 앱이 일시 중단된 당시에 저장된 주식 및 차트 정보를 다시 가져옵니다. 또한 앱이 캐시된 네트워크 데이터를 새로 고칩니다. 이렇게 하면 사용자가 앱에서 전환할 때 표시된 동일한 주식이 표시되지만 해당 주식의 가격, 차트 및 뉴스 기사는 모두 최신 상태로 제공됩니다.

JavaScript에서의 활성화 처리

WinJS(JavaScript용 Windows 라이브러리)를 사용하여 Metro 스타일 앱을 작성하는 경우 activated 이벤트를 사용하여 활성화를 처리할 수 있습니다.

activated 이벤트 처리기 코드에서 앱은 sessionState 개체를 보고 저장된 데이터를 로드해야 하는지, 아니면 기본 홈 보기를 표시해야 하는지 확인할 수 있습니다. SessionStateeventArgs.detail.previousExecutionState를 검사하여 앱의 마지막 상태를 자동으로 결정합니다. sessionState가 채워진 경우 이를 사용하여 세션 데이터를 복원하고, 그렇지 않으면 앱의 기본 데이터를 사용합니다.

var app = WinJS.Application;

function activatedHandler(eventArgs) {
if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) {
// Check whether the session state variables are valid.
// If so, retrieve the stock and range values saved in the checkpoint handler
if (app.sessionState) {
stock = app.sessionState.lastSeenStock;
range = app.sessionState.lastSeenRange;
}
// If not, use the app's default values
else{
stock = "DOW";
range = "1M";
}

// Initialize the WinJS controls asynchronously behind the app splash screen
// Start retrieving the latest stock data asynchronously after the controls are ready
eventObject.setPromise(WinJS.UI.processAll().then(function() {
Api.initializeUserStocks();
}));
}
}

app.addEventListener("activated", activatedHandler);
       

JavaScript에서 활성화를 처리하는 방법에 대한 자세한 내용은 개발자 센터에서 앱을 활성화하는 방법(JavaScript 및 HTML)을 참조하십시오.

XAML에서의 활성화 처리

XAML 및 C#을 사용하는 Metro 스타일 앱의 경우 OnLaunched 이벤트를 재정의하여 타일에서의 기본 활성화를 처리할 수 있습니다.

OnLaunched 이벤트 처리기 코드에서 앱은 이벤트 인수의 PreviousExecutionState를 확인할 수 있습니다. 이 값이 Terminated와 같은 경우 Suspending 이벤트에 저장된 데이터를 복원합니다. 값이 다른 경우에는 앱의 기본 데이터를 사용합니다.

async protected override void OnLaunched(LaunchActivatedEventArgs args)
{
// Check whether the session data should be restored
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
// Here we've created a SuspensionManager class which handles restoring session
// data from a file and then gives access to that data through a Dictionary
await SuspensionManager.RestoreAsync();

// Retrieve the stock and range values saved in the suspend handler
stock = SuspensionManager.SessionState["lastSeenStock"];
range = SuspensionManager.SessionState["lastSeenRange"];
}
// If not, use the app's default values
else
{
stock = "DOW";
range = "1M";
}

// Start retrieving the latest stock data
Api.InitializeUserStocks();

Window.Current.Activate();
}

XAML에서 활성화를 처리하는 방법에 대한 자세한 내용은 개발자 센터에서 앱을 활성화하는 방법(VB/C#/C++ 및 XAML)을 참조하십시오.

뛰어난 앱 수명 환경을 만드는 방법에 대한 팁

이제 모든 기본 사항을 알았으므로 항상 작동 중이고 최신 상태를 유지하는 것으로 사용자에게 인식되는 앱의 뛰어난 수명 환경을 구축하는 데 유용한 몇 가지 팁을 살펴보겠습니다.

간혹, 처음부터 새로 시작하는 것이 가장 좋습니다.

사용자가 앱을 마지막으로 본 지 오래된 경우 기본 보기로 앱을 다시 설정하는 것이 가장 좋습니다. 기간은 원하는 대로 설정할 수 있지만 앱의 콘텐츠가 오래되거나 부실한 것으로 보이는 경우 앱을 해당 홈 보기로 되돌리는 것이 좋습니다. 이렇게 하면 앱이 사용자에게 보다 지능적으로 보이게 됩니다.

예를 들어 뉴스 리더 앱을 구축하는 경우 사용자가 앱에서 전환한 후 앱이 일시 중단될 수 있습니다. 이후에 사용자가 뉴스 리더 앱으로 돌아오면 앱이 다시 시작됩니다. 이 경우 다시 시작 처리기에서 현재 기사가 얼마나 오래되었는지 확인하여 부실한지 여부를 결정합니다. 기사가 너무 오래된 경우 오래된 기사 대신 기본 홈 보기를 표시합니다.

올바른 데이터를 올바른 시점에 저장하십시오.

중요한 데이터는 앱이 사용되는 동안 항상 증분 저장해야 합니다. 앱은 최대 5초 동안만 suspending 이벤트 처리기 코드를 실행하기 때문에 앱이 일시 중단될 때까지 중요한 앱 데이터가 영구 저장소에 저장되도록 해야 합니다.

앱을 작성할 때 관리할 데이트 유형에는 세션 데이터사용자 데이터의 두 가지가 있습니다. 세션 데이터는 앱에서 사용자의 현재 환경과 관련된 임시 데이터입니다. 예를 들어 사용자가 현재 보고 있는 주식, 사용자가 전자책에서 현재 읽고 있는 페이지, 긴 항목 목록의 스크롤 위치 등이 여기에 해당됩니다. 사용자 데이터는 영구적이며 사용자가 항상 액세스할 수 있어야 합니다. 예를 들어 사용자가 현재 입력 중인 문서, 앱에서 찍은 사진, 사용자의 게임 진행 상태 등이 여기에 해당됩니다.

앱이 일시 중단될 때까지 두 데이터 유형 모두 영구 저장소에 저장되었는지 확인하십시오.

세션 데이터 복원

사용자는 Metro 스타일 앱이 일반적으로 마지막으로 사용한 상태를 그대로 유지하기를 원합니다. 개발자의 관점에서 앱이 일시 중단된 상태에서 다시 시작되거나 실행 중이지 않은 상태에서 활성화된 경우 이전에 저장된 세션 데이터를 복원하는 것이 적절한 경우가 많습니다.

예를 들어 앱에 쇼핑 카트 기능이 있을 때 사용자가 카트에 항목을 추가한 다음 앱에서 전환했다가 앱을 다시 시작하거나 다시 활성화한 경우 카트에 해당 항목이 그대로 유지되는 것이 좋습니다.

또 다른 예로, 뉴스 기사를 표시하는 앱의 경우 사용자는 특정 기사를 본 다음 다른 앱으로 전환했다가 다시 돌아왔을 때 이전에 보고 있던 기사가 표시되기를 원합니다.

suspending 이벤트 처리기에서 배타 리소스를 해제하십시오.

앱이 실행 중에 배타 리소스(예: 파일 핸들 또는 외부 장치 참조)를 얻은 경우 suspending 이벤트가 수신되면 이러한 리소스를 해제해야 합니다. 또한 resuming 이벤트가 수신되면 필요한 경우 이러한 배타 리소스를 회수해야 합니다.

앱을 닫지 마십시오.

Windows 8의 Metro 스타일 앱은 자동으로 닫히거나 사용자가 앱을 닫을 수 있는 앱 UI를 제공해서는 안 됩니다. 앱 일시 중단 및 종료는 시스템 성능과 배터리 수명을 유지하기 위해 Windows에서 사용자를 대신해 처리하는 것입니다. 사용자가 앱을 닫으려면 화면 위쪽에서 아래쪽으로 살짝 밀거나 Alt+F4를 누르면 됩니다.

결론

세 개의 이벤트(suspending, resumingactivated)를 사용하면 사용자에게 앱이 항상 작동 중인 것처럼 보입니다. 그러나 사용자가 앱을 사용하지 않는 경우에도 불필요하게 배터리가 소모되거나 시스템 성능이 저하되지 않습니다. 보다 슬림하고 다양한 모바일 장치의 세계에서 새로운 Metro 스타일 앱 수명 주기는 모든 장치에서 앱을 더욱 빛나게 해줄 것입니다.

- Windows 프로그램 관리자, Adam Barrus

이 글은 여러 사람의 도움으로 작성되었습니다. Jake Sabulsky, Ben Srour, Ben Betz, Marco Matos, Ryan Haveson, Ian LeGrow 및 John Montgomery의 도움에 감사드립니다.

  • Loading...
Leave a Comment
  • Please add 6 and 3 and type the answer here:
  • Post