Bu bölüm çalışan bir uygulamayı kapatmakla ilgili konular ve seçeneklerin yanı sıra, yüklenmiş bir Adobe® AIR® uygulamasını başlatmanın yollarını açıklıyor.
Not:
NativeApplication, InvokeEvent ve BrowserInvokeEvenet nesneleri yalnızca AIR uygulama sanal alanında çalışan SWF içeriği için uygundur. Tarayıcı veya tek başına oynatıcı (projektör) dahilinde veya uygulama sanal alanının dışındaki bir AIR uygulamasının içinde olup Flash Player çalışma zamanında çalışan SWF içeriği bu sınıflara erişemez.
AIR uygulamalarını başlatma ve sonlandırmayla ilgili hızlı açıklama ve kod örnekleri için Adobe Geliştirici Bağlantısında bulunan aşağıdaki hızlı başlangıç makalelerine bakın:
Uygulama başlatma
AIR uygulaması, kullanıcı (veya işletim sistemi) aşağıdaki eylemlerde bulunduğunda çağrılır:
-
Uygulamayı masaüstü kabuğundan başlatırsa.
-
Uygulamayı komut satırı kabuğunda bir komut olarak kullanırsa.
-
Uygulamanın varsayılan açılış uygulaması olduğu bir dosya türü açarsa.
-
(Mac OS X) Sabitleme görev çubuğundaki uygulama simgesini tıklatırsa (uygulama o anda çalışır durumda olsun veya olmasın).
-
Uygulamayı yükleyiciden başlatmayı seçerse (yeni bir yükleme işleminin sonunda veya zaten yüklenmiş olan uygulamanın AIR dosyasını çift tıklatarak).
-
Yüklenen sürüm, uygulama güncellemelerini kendisinin işleyeceği uyarısını verdiğinde, bir AIR uygulaması güncellemesi başlatır (uygulama tanımlayıcı dosyasına bir
<customUpdateUI>true</customUpdateUI>
bildirimi katarak).
-
(iOS) Apple Push Notification servisinden (APNs) bildirim alır.
-
Uygulamayı URL aracılığıyla çalıştırır.
-
AIR uygulaması için tanımlayıcı bilgiler belirten
com.adobe.air.AIR launchApplication()
yöntemini çağıran bir Flash kimlik kartı veya uygulamasını barındıran bir web sayfasını ziyaret ederse. (Uygulama tanımlayıcı ayrıca tarayıcı başlatması için bir
<allowBrowserInvocation>true</allowBrowserInvocation>
bildirimi içermelidir.)
Bir AIR uygulaması çağrıldığında, AIR, NativeApplication nesnesi yoluyla
invoke
türü bir InvokeEvent nesnesi gönderir. Bir uygulama zamanının kendini başlatmasını ve olay dinleyicisini kaydetmesini sağlamak için,
invoke
olayları atılmak yerine kuyruğa gönderilir. Bir dinleyici kaydedildiğinde sıradaki tüm olaylar iletilir.
Not:
Bir uygulama tarayıcı başlatma özelliği kullanılarak çağrıldığında, uygulama zaten çalışır halde değilse NativeApplication nesnesi yalnızca bir
invoke
olayı gönderir.
invoke
olaylarını almak için, NativeApplication nesnesinin (
NativeApplication.nativeApplication)
addEventListener()
yöntemini çağırın. Bir olay dinleyicisi
invoke
olayı için kaydolduğunda, kayıttan önce gerçekleşen tüm
invoke
olaylarını da alır. Sıradaki
invoke
olayları,
addEventListener()
yöntemine yapılan çağrı geri döndükten sonra kısa aralıklarla, bir kerede bir olay olmak üzere gönderilir. Bu işlem sırasında yeni bir
invoke
olayı gerçekleşirse, bu olay sıradaki bir veya daha fazla olaydan önce gönderilebilir. Bu olay sıralaması sayesinde, başlatma kodunuz çalışmadan önce gerçekleşen tüm
invoke
olaylarını işleyebilirsiniz. Bir olay dinleyicisini çalışmaya sonradan ekleseniz de (uygulama başlatıldıktan sonra), uygulamanın başlamasından itibaren gerçekleşen tüm
invoke
olaylarını alacağını göz önünde bulundurun.
AIR uygulamasının yalnızca bir örneği başlatılır. Zaten çalışmakta olan bir uygulama tekrar çağrılırsa, AIR çalışan örneğe yeni bir
invoke
olayı gönderir. Bir
invoke
olayına yanıt vermek ve uygun eylemi gerçekleştirmek (yeni bir belge penceresi açmak gibi) AIR uygulamasının sorumluluğundadır.
InvokeEvent
nesnesi uygulamaya iletilen tüm argümanların yanı sıra, uygulamanın çağrıldığı dizini de içerir. Uygulama bir dosya türü ilişkilendirmesi nedeniyle çağrıldıysa, dosya yolunun tamamı komut satırı argümanlarına dahil edilir. Benzer şekilde uygulama bir uygulama güncellemesi nedeniyle çağrıldıysa, güncelleme AIR dosyası yolunun tamamı sağlanır.
Bir işlemde birden çok dosya açıldığında, Mac OS X'te tek bir InvokeEvent nesnesi gönderilir. Her bir dosya
arguments
dizisinde mevcuttur. Windows ve Linux'ta her dosya için ayrı bir InvokeEvent nesnesi gönderilir.
Uygulamanız
invoke
olaylarını, bir dinleyiciyi NativeApplication nesnesiyle kaydederek işleyebilir:
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvokeEvent);
Ve bir olay dinleyicisi tanımlama:
var arguments:Array;
var currentDir:File;
public function onInvokeEvent(invocation:InvokeEvent):void {
arguments = invocation.arguments;
currentDir = invocation.currentDirectory;
}
Komut satırı argümanlarını yakalama
Bir AIR uygulamasının başlatılmasıyla ilişkilendirilen komut satırı argümanları, NativeApplication nesnesi tarafından gönderilen InvokeEvent nesnesinde iletilir. InvokeEvent
arguments
özelliği, bir AIR uygulaması çağrıldığında işletim sistemi tarafından verilen bir dizi argümanı içerir. Argümanlar göreceli dosya yolları içeriyorsa, yolları genellikle
currentDirectory
özelliğini kullanarak çözebilirsiniz.
Bir AIR programına iletilen argümanlar, çift tırnak işareti içinde olmadığı sürece beyaz boşluk sınırlı dizeler olarak kabul edilir:
Argümanlar
|
Dizi
|
tick tock
|
{tick,tock}
|
tick "tick tock"
|
{tick,tick tock}
|
"tick" “tock”
|
{tick,tock}
|
\"tick\" \"tock\"
|
{"tick","tock"}
|
Bir InvokeEvent öğesinin
currentDirectory
özelliği, uygulamanın başlatıldığı dizini temsil eden bir File nesnesi içerir.
Bir uygulama, uygulama tarafından kaydedilen türde bir dosya açıldığı için çağrıldığında, dosyanın yerel yolu komut satırı argümanlarına dize olarak dahil edilir. (Dosyada istenilen işlemin açılmasından veya gerçekleştirilmesinden uygulamanız sorumludur.) Benzer şekilde bir uygulama kendisini güncellemek üzere programlandığında (standart AIR güncelleme kullanıcı arabirimine güvenmek yerine), kullanıcı, eşleşen uygulama kimliğine sahip bir uygulama içeren AIR dosyasını çift tıklattığında AIR dosyasının yerel yolu da dahil edilir.
Dosyaya
currentDirectory
File nesnesinin
resolve()
yöntemini kullanarak erişebilirsiniz.
if((invokeEvent.currentDirectory != null)&&(invokeEvent.arguments.length > 0)){
dir = invokeEvent.currentDirectory;
fileToOpen = dir.resolvePath(invokeEvent.arguments[0]);
}
Ayrıca argümanın gerçekten bir dosya yolu olduğunu doğrulamanız gereklidir.
Örnek: Invocation olay günlüğü
Aşağıdaki örnek
invoke
olayı için dinleyicilerin nasıl kaydedileceğini ve olayın nasıl işleneceğini gösterir. Örnek, alınan tüm invocation olaylarının günlüğünü tutar ve geçerli dizini ve komut satırı argümanlarını gösterir.
ActionScript örneği
package
{
import flash.display.Sprite;
import flash.events.InvokeEvent;
import flash.desktop.NativeApplication;
import flash.text.TextField;
public class InvokeEventLogExample extends Sprite
{
public var log:TextField;
public function InvokeEventLogExample()
{
log = new TextField();
log.x = 15;
log.y = 15;
log.width = 520;
log.height = 370;
log.background = true;
addChild(log);
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);
}
public function onInvoke(invokeEvent:InvokeEvent):void
{
var now:String = new Date().toTimeString();
logEvent("Invoke event received: " + now);
if (invokeEvent.currentDirectory != null)
{
logEvent("Current directory=" + invokeEvent.currentDirectory.nativePath);
}
else
{
logEvent("--no directory information available--");
}
if (invokeEvent.arguments.length > 0)
{
logEvent("Arguments: " + invokeEvent.arguments.toString());
}
else
{
logEvent("--no arguments--");
}
}
public function logEvent(entry:String):void
{
log.appendText(entry + "\n");
trace(entry);
}
}
}
Flex örneği
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
invoke="onInvoke(event)" title="Invocation Event Log">
<mx:Script>
<![CDATA[
import flash.events.InvokeEvent;
import flash.desktop.NativeApplication;
public function onInvoke(invokeEvent:InvokeEvent):void {
var now:String = new Date().toTimeString();
logEvent("Invoke event received: " + now);
if (invokeEvent.currentDirectory != null){
logEvent("Current directory=" + invokeEvent.currentDirectory.nativePath);
} else {
logEvent("--no directory information available--");
}
if (invokeEvent.arguments.length > 0){
logEvent("Arguments: " + invokeEvent.arguments.toString());
} else {
logEvent("--no arguments--");
}
}
public function logEvent(entry:String):void {
log.text += entry + "\n";
trace(entry);
}
]]>
</mx:Script>
<mx:TextArea id="log" width="100%" height="100%" editable="false"
valueCommit="log.verticalScrollPosition=log.textHeight;"/>
</mx:WindowedApplication>
Kullanıcının oturum açması sırasında bir AIR uygulaması başlatmak
Bir AIR uygulaması, geçerli kullanıcı oturum açtığında NativeApplication
startAtLogin
özelliğine
true
değeri verilerek otomatik olarak başlatılacak duruma getirilebilir. Bir kez ayarlandıktan sonra, kullanıcı her oturum açtığında uygulama otomatik olarak başlatılır. Uygulama, ayar
false
olarak değiştirilene, kullanıcı ayarı işletim sisteminden elle değiştirene veya uygulama kaldırılana kadar başlangıçta açılmaya devam eder. Oturum açılırken başlatma, bir çalışma zamanı ayarıdır. Ayar yalnızca geçerli kullanıcıya yöneliktir. Ayrıca
startAtLogin
özelliğinin
true
olarak başarıyla ayarlanması için uygulama yüklenmelidir. Uygulama yüklenmemişken özellik ayarlanırsa (ADL ile başlatıldığında olduğu gibi) bir hata verilir.
Not:
Uygulama, bilgisayar sistemi başlatıldığında başlamaz. Kullanıcı oturum açtığında başlar.
Bir uygulamanın otomatik olarak mı yoksa bir kullanıcı eylemi sonucunda mı açıldığını belirlemek için InvokeEvent nesnesinin
reason
özelliğini inceleyebilirsiniz. Özellik
InvokeEventReason.LOGIN
öğesine eşit ise uygulama otomatik olarak başlamış demektir. Diğer çağırma yolları için
reason
özelliği aşağıdaki gibi ayarlanır:
-
InvokeEventReason.NOTIFICATION
(yalnızca iOS) - Uygulama APNs ile çağırıldı. APNs hakkında daha fazla bilgi için
Push bildirimlerini kullanma
bölümüne göz atın.
-
InvokeEventReason.OPEN_URL
- Uygulama, başka bir uygulama veya sistem tarafından çağırıldı.
-
InvokeEventReason.Standard
- Tüm diğer durumlar.
Reason
özelliğine erişmek için uygulamanız AIR 1.5.1 veya üzerini hedeflemelidir (uygulama tanımlayıcı dosyasında doğru ad alanı değerini ayarlayarak).
Aşağıdaki basitleştirilmiş uygulama bir invoke olayı meydana geldiğinde nasıl davranacağına karar vermek için InvokeEvent reason özelliğini kullanıyor. Reason özelliği "oturum açma" ise, uygulama arka planda kalır. Değil ise bu özellik ana uygulamayı görünür hale getirir. Bu deseni kullanan uygulama genelde oturum açma sırasında açılır, böylece arka planda işleme veya olay izlemeye devam edebilir ve kullanıcı tarafından tetiklenen bir invoke olayına yanıt olarak bir pencere açar.
package {
import flash.desktop.InvokeEventReason;
import flash.desktop.NativeApplication;
import flash.display.Sprite;
import flash.events.InvokeEvent;
public class StartAtLogin extends Sprite
{
public function StartAtLogin()
{
try
{
NativeApplication.nativeApplication.startAtLogin = true;
}
catch ( e:Error )
{
trace( "Cannot set startAtLogin:" + e.message );
}
NativeApplication.nativeApplication.addEventListener( InvokeEvent.INVOKE, onInvoke );
}
private function onInvoke( event:InvokeEvent ):void
{
if( event.reason == InvokeEventReason.LOGIN )
{
//do background processing...
trace( "Running in background..." );
}
else
{
this.stage.nativeWindow.activate();
}
}
}
}
Not:
Davranıştaki değişikliği görmek için uygulamayı paketleyin ve yükleyin.
startAtLogin
özelliği yalnızca yüklü uygulamalar için ayarlanabilir.
Tarayıcıda bir AIR uygulaması başlatma
Bir web sitesi, tarayıcı başlatma özelliğini kullanarak, tarayıcıdan başlatılacak şekilde ayarlı olan yüklenmiş AIR uygulamasını başlatabilir. Tarayıcı başlatmaya yalnızca uygulama tanımlayıcı dosyası
allowBrowserInvocation
ayarını
true
olarak ayarladıysa izin verilir:
<allowBrowserInvocation>true</allowBrowserInvocation>
Uygulama tarayıcı üzerinden çağrıldığında, uygulamanın NativeApplication nesnesi bir BrowserInvokeEvent nesnesi gönderir.
BrowserInvokeEvent olaylarını almak için, AIR uygulamasında NativeApplication nesnesinin (
NativeApplication.nativeApplication
)
addEventListener()
yöntemini çağırın. Bir olay dinleyicisi BrowserInvokeEvent olayı için kaydolduğunda, kayıttan önce gerçekleşen tüm BrowserInvokeEvent olaylarını da alır. Bu olaylar
addEventListener()
yöntemine yapılan çağrı geri döndükten sonra gönderilir, ancak bu gönderme işlemi, kayıttan sonra alınmış olma ihtimali bulunan diğer BrowserInvokeEvent olaylarından önce gerçekleşmeyebilir. Bu sayede, başlatma kodunuzun çalışmasından önce gerçekleşen (uygulama başlangıçta tarayıcıdan çağrıldığında olduğu gibi) BrowserInvokeEvent olaylarını işleyebilirsiniz. Bir olay dinleyicisini çalışmaya sonradan ekleseniz de (uygulama başlatıldıktan sonra), uygulamanın başlamasından itibaren gerçekleşen tüm BrowserInvokeEvent olaylarını alacağını göz önünde bulundurun.
BrowserInvokeEvent nesnesi aşağıdaki özelliklere sahiptir:
Özellik
|
Açıklama
|
arguments
|
Uygulamaya iletilecek bir argüman (dize) dizisi.
|
isHTTPS
|
Tarayıcıdaki içeriğin https URL şemasını kullanıp (
true
) kullanmaması (
false
).
|
isUserEvent
|
Tarayıcı başlatmanın bir user olayıyla sonuçlanıp sonuçlanmaması. AIR 1.0'da, bu ayar her zaman
true
şeklindedir; AIR'de tarayıcı başlatma özelliği için bir user olayı gereklidir.
|
sandboxType
|
Tarayıcıdaki içeriğin sanal alan türü. Geçerli değerler,
Security.sandboxType
özelliğinde kullanılabilen değerlerle aynı olarak tanımlanır ve aşağıdakilerden biri olabilir:
-
Security.APPLICATION
— İçerik, uygulama güvenlik sanal alanındadır.
-
Security.LOCAL_TRUSTED
— İçerik, dosya sistemiyle yerel güvenlik sanal alanındadır.
-
Security.LOCAL_WITH_FILE
— İçerik, dosya sistemiyle yerel güvenlik sanal alanındadır.
-
Security.LOCAL_WITH_NETWORK
— İçerik, ağ iletişimiyle yerel güvenlik sanal alanındadır.
-
Security.REMOTE
— İçerik, uzak (ağ) etki alanındadır.
|
securityDomain
|
"www.adobe.com"
veya
"www.example.org"
gibi tarayıcıdaki içeriğin güvenlik etki alanı. Bu özellik yalnızca uzak güvenlik sanal alanındaki içerik için (ağ etki alanından gelen içerik) ayarlanır. Yerel veya uygulama güvenlik sanal alanındaki içerik için ayarlanmaz.
|
Tarayıcı başlatma özelliğini kullanırsanız, güvenlik sonuçlarını dikkate aldığınızdan emin olun. Bir web sitesi bir AIR uygulaması açtığında, BrowserInvokeEvent nesnesinin
arguments
özelliği yoluyla veri gönderebilir. Bu verileri dosya veya kod yükleme API'leri gibi duyarlı bir işlemde kullanırken dikkatli olun. Tehlike düzeyi, uygulamanın verilerle ne yaptığına bağlı olarak değişir. Yalnızca belirli bir web sitesinin uygulamayı çağırmasını bekliyorsanız, uygulama BrowserInvokeEvent nesnesinin
securityDomain
özelliğini kontrol etmelidir. Ayrıca uygulamayı çağıran web sitesinin HTTP'leri kullanmasını gerekli kılabilirsiniz, bunu da BrowserInvokeEvent nesnesinin
isHTTPS
özelliğini kontrol ederek doğrulayabilirsiniz.
Uygulama, iletilen verileri doğrulamalıdır. Örneğin bir uygulamanın URL'leri belirli bir etki alanına iletmesi bekleniyorsa, URL'lerin gerçekten de o etki alanına işaret ettiğini doğrulamalıdır. Böylece bir saldırganın, uygulamayı yanıltarak duyarlı verileri kendisine göndermesini sağlaması engellenebilir.
Hiçbir uygulama, yerel kaynaklara işaret edebilecek BrowserInvokeEvent argümanlarını kullanmamalıdır. Örneğin bir uygulama, tarayıcı tarafından iletilen bir yola dayalı olarak File nesneleri oluşturmamalıdır. Uzak yolların tarayıcı tarafından iletilmesi bekleniyorsa, uygulama, yolların uzak bir protokol yerine
file://
protokolünü kullanmasını sağlamalıdır.
Uygulama sonlandırma
Bir uygulamayı sonlandırmanın en hızlı yolu NativeApplication exit () yöntemini çağırmaktır. Bu yol, uygulamanızda kaydedilecek veri veya temizlenecek harici kaynaklar olmadığında işe yarar.
exit()
öğesini çağırmak tüm pencereleri kapatır ve uygulamayı sonlandırır. Ancak uygulamanızın pencerelerinin veya diğer bileşenlerinin, örneğin gerekli verileri kaydetmek üzere sonlandırma işlemini kesmesine izin vermek için, uygun uyarı olaylarını
exit()
öğesini çağırmadan önce gönderin.
Bir uygulamayı başarıyla kapatırken düşünülecek bir başka nokta, kapatma işlemi nasıl başlarsa başlasın tek bir çalışma yolu sağlamaktır. Kullanıcı (veya işletim sistemi) uygulama sonlandırmayı aşağıdaki yollarla tetikleyebilir:
-
NativeApplication.nativeApplication.autoExit
true
olduğunda son uygulama penceresini kapatarak.
-
Örneğin kullanıcı varsayılan menüden uygulamadan çık komutunu seçtiğinde işletim sisteminden uygulamadan çıkış komutunu seçerek. (Bu yalnızca Mac OS'de gerçekleşir; Windows ve Linux, sistem kromu aracılığıyla uygulama çıkış komutu sağlamaz.)
-
Bilgisayarı kapatarak.
Bir çıkış komutu bu rotalardan biriyle işletim sisteminde araya girdiğinde, NativeApplication bir
exiting
olayı gönderir. Hiçbir dinleyici
exiting
olayını iptal etmezse, tüm açık pencereler kapanır. Her pencere bir
closing
ve ardından bir
close
olayı gönderir. Pencerelerden biri
closing
olayını iptal ederse, kapatma işlemi durur.
Pencerelerin kapanma sırası uygulamanız için bir sorunsa, NativeApplication öğesinden
exiting
olayını dinleyin ve pencereleri kendiniz uygun bir sırayla kapatın. Bunu yapmanız gerekebilir, örneğin araç paletleri olan bir belge pencereniz varsa. Sistemin paletleri kapatması uygunsuz, hatta daha da kötü olabilirdi, ancak kullanıcı bazı verileri kaydetmek için çıkış komutunu iptal etmeye karar verdi. Windows'ta
exiting
olayını yalnızca son pencereyi kapattıktan sonra alırsınız (NativeApplication nesnesinin
autoExit
özelliği
true
değerine ayarlıysa).
Tüm platformlarda tutarlı davranış sağlamak için, çıkış sırası ister işletim sisteminden, ister menü komutlarından veya ister uygulama mantığından başlatılmış olsun, uygulamadan çıkmak için aşağıdaki uygulamaları izleyin:
-
Her zaman uygulama kodunda
exit()
öğesini çağırmadan önce NativeApplication nesnesi üzerinden bir
exiting
olayı gönderin ve uygulamanızın başka bir bileşeninin olayı iptal etmediğinden emin olun.
public function applicationExit():void {
var exitingEvent:Event = new Event(Event.EXITING, false, true);
NativeApplication.nativeApplication.dispatchEvent(exitingEvent);
if (!exitingEvent.isDefaultPrevented()) {
NativeApplication.nativeApplication.exit();
}
}
-
NativeApplication.nativeApplication
nesnesinden uygulama
exiting
olayını dinleyin ve işleyicideki tüm pencereleri kapatın (önce bir
closing
olayı göndererek). Tüm pencereler kapatıldıktan sonra, uygulama verilerini kaydetmek veya geçici dosyaları silmek gibi gerekli olan tüm temizlik görevlerini yerine getirin. Uygulamadan çıkılmadan önce bittiğinden emin olmak için temizleme sırasında yalnızca senkronize yöntemler kullanın.
Pencerelerinizin kapanma sırası önemli değilse,
NativeApplication.nativeApplication.openedWindows
dizisinde ilerleyebilir ve sırayla tüm pencereleri kapatabilirsiniz. Sıra
önemliyse
, pencerelerin doğru sırayla kapanması için bir yöntem sağlayın.
private function onExiting(exitingEvent:Event):void {
var winClosingEvent:Event;
for each (var win:NativeWindow in NativeApplication.nativeApplication.openedWindows) {
winClosingEvent = new Event(Event.CLOSING,false,true);
win.dispatchEvent(winClosingEvent);
if (!winClosingEvent.isDefaultPrevented()) {
win.close();
} else {
exitingEvent.preventDefault();
}
}
if (!exitingEvent.isDefaultPrevented()) {
//perform cleanup
}
}
-
Windows her zaman kendi
closing
olaylarını dinleyerek kendi temizleme işlemini gerçekleştirmelidir.
-
Daha önceden çağrılan işleyiciler sonraki işleyicilerin
exiting
olayını iptal edip etmeyeceğini bilemeyeceği için, uygulamanızda yalnızca bir
exiting
dinleyicisi kullanın. (Çalışma sırasına güvenmek de doğru olmaz.)
|
|
|