AIR uygulamasını başlatma ve sonlandırma

Adobe AIR 1.0 ve üstü

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şlediğini bildirdiğinde bir AIR uygulaması güncellemesi başlatırsa (uygulama tanımlayıcı dosyasına bir <customUpdateUI>true</customUpdateUI> bildirimi katarak).

  • 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 NativeApplicationstartAtLogin ö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. Başka herhangi bir başlatma yolunda, reason özelliği InvokeEventReason.STANDARD öğesine eşittir. reason özelliğine erişmek için, uygulamanız AIR 1.5.1'i hedef almalıdır (uygulama tanımlama 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.autoExittrue 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:

  1. 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(); 
        } 
    } 
  2. 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 
        } 
    } 
  3. Windows her zaman kendi closing olaylarını dinleyerek kendi temizleme işlemini gerçekleştirmelidir.

  4. 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.)