Android Başlangıç Programı Yazmak

Hikaye: Telefonunuz yeni açıldığında, programınızın otomatik olarak açılmasını sağlayabilir, ya da arka planda bazı önyüklemeleri gerçekleştirebilirsiniz. İşte bende bugün yeni yapmaya başladığım bir programın benzer bir özelliği olmasını istediğim için bu konuyu araştırmaya koyuldum. Zaman içerisinde değişen Android API’leri yüzünden internetten araştırıp bulduğum hiç bir bilginin tam ve geçerli olmaması sonucunda, yarım saatte yapmayı planladığım şeyi ancak yarım günde yapabildim. Zaten bu dökümanı yazma sebebim de tam olarak bu oluyor.

Background: Öncelikle Broadcast Receiver (ya da eski ismiyle Intent Receiver) ile, cep telefonumuzun açıldığını anlayacağız. Peki ama Broadcast Receiver’da ne oluyor? derseniz; Broadcast kelime manası olarak, “yayın yapmak” demektir. Bunu televizyon yayınına benzetebiliriz. Ortada bir antenden, her tarafa yayın yapılır ve o sinyali almak isteyen herkes alır. Tam olarak Android işletim sistemi içerisindeki broadcast yayını da böyle yapılır. İşletim sistemi içerisinde gerçekleşen bir olay karşısında, “ben bunu yaptım” diye bir yayın yapar. Bu bilgiyi almak isteyen her program bunu alarak kullanır, tepki verir. Mesela cep telefonuna bir SMS mesajı geldiğinde, Android bir broadcast yayını ile(intent göndererek) tüm programlara SMS alındığına dair bilgilendirir. Aynı şekilde, cep telefonumuz açıldığında, Android bize telefonun açılışını haber verebilir. Biz yeter ki bu yöne kulağımızı kabartalım :)

İcraat: İşte BroadReceiver sayesinde, tüm broadcastlara ulaşabiliriz. Fakat önemli olan tüm broadcast yayınları içerisinden işimize yarayacak olana ulaşabilmek. Bunun için gelen broadcastları AndroidManifest.xml içerisinde filtreleyeceğiz. Tabi bir de tüm bu işlemler için gerekli permission’ları yine AndroidManifest.xml içerisinde tanımlamış olmamız gerekiyor. İsterseniz artık icraata geçelim..

<receiver android:name=”.StartupBroadcastReceiver”>
        <intent-filter>
                <action android:name=”android.intent.action.BOOT_COMPLETED” />
                <category android:name=”android.intent.category.LAUNCHER” />
        </intent-filter>
</receiver>

Yukarıdaki gibi bir receiver’ımız için bir filtre yazıyoruz. Yani, tüm broadcast yayınları içerisinden telefonun açılışının ardından yapılan yayını yakalayacağız. Bunu

android.intent.action.BOOT_COMPLETED

sayesinde anlayacağız. Fakat bu broadcast yayını dinleyebilmemiz için de, belli izinleri almış olmamız gerekiyor. Bunun için yine AndrodManifest.xml’in içerisine şu permission kodunu ekliyoruz.

<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />

Yanılgı: Her ne kadar Android’in kendi sitesindeki dökümanlarda ve diğer bir çok sitede yukarıdaki permission’un yeterli olduğu yazsa da, telefon açılışının dinlenmesinde kullanılacak izin için aslında bu tek başına yeterli değildir. Benim yarım gün boyunca boşuna uğraşmamın sebeblerinden bir tanesi olan bu permissionun yanına aşağıdakilerin de tamamını eklemediğiniz sürece, (Android 1.5 ve 2.0′da test edilmiştir) almak istediğimiz broadcast yayınını asla alamayacağız. Ekleyeceğimiz extra permission’lar.

<uses-permission android:name=”android.permission.ACCESS_LOCATION” />
        <uses-permission android:name=”android.permission.ACCESS_GPS” />
        <uses-permission android:name=”android.permission.ACCESS_ASSISTED_GPS” />
        <uses-permission android:name=”android.permission.ACCESS_CELL_ID” />

Ne alaka? diyebilirsiniz.. fakat uzuuun araştırmalarım sonucunda ben internette çözüm yolu olarak sadece bunun işe yaradığını gördüm. (Extra not: gerçek bir telefona bu programı kurmaya çalıştığımda, bu extra izinlerin install ekranındaki bilgilendirmede karşıma çıkmadığını gördüm. Bunun manası, “ben aslında bu özellikleri kullanmıyorum” demek olsa da, bize neden bu izinleri aldırttığını henüz çözebilmiş değilim.)

Sıra geldi, filtreleyerek aldığımız broadcastımızın çalışacağı class’ı oluşturmaya.

public class StartupIntentReceiver extends  BroadcastReceiver  {
   @Override
    public void onReceive(Context context, Intent intent) {
    Intent startupIntent = new Intent(context, RunMfa.class);
    startupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(startupIntent);
  }
}

Filtreleyerek aldığımız broadcastımız bu classın çalışmasına neden oldu. Ve bizde Intent ile RunMfa activity’sinin çalışmasını söylüyoruz. (Mesela bu programımızın ana ekranı olabilir..)

public class RunMfa extends Activity{
   TextView tv;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      tv = (TextView) findViewById(R.id.serialTV);  
      tv.setText(“Run start up ile calisti -by Mustafa Ferhan Akman”);
   }
}

AndroidManifest.xml’in son hali:

<?xml version=”1.0¨ encoding=”utf-8¨?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android“  
package=”com.androidprogramcisi” android:versionCode=”1¨  android:versionName=”1.0¨> 

 <uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />
 <uses-permission android:name=”android.permission.ACCESS_LOCATION” />
 <uses-permission android:name=”android.permission.ACCESS_GPS” />
 <uses-permission android:name=”android.permission.ACCESS_ASSISTED_GPS” />
 <uses-permission android:name=”android.permission.ACCESS_CELL_ID” />
 
 <application android:icon=”@drawable/icon”   android:label=”@string/app_name”
<activity android:name=”.RunMfa” android:label=”@string/app_name”></activity>

 <receiver android:name=”.StartupIntentReceiver”>
  <intent-filter>
   <action android:name=”android.intent.action.BOOT_COMPLETED” />
   <category android:name=”android.intent.category.LAUNCHER” />
  </intent-filter>
 </receiver>
</application>
 <uses-sdk android:minSdkVersion=”3¨ />
</manifest>

inşaallah benim gibi uzun uzun araştırmak zorunda kalmadan bu dökümana ulaşırsınız diyerek yazımı sonlandırıyorum..

(alıntıdır…)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak.