Mehmet Ethem SULAN :: Android :: Start Activity from Service and Start Service from Activity

Bu örnekte bir Android Activity içinde button tıklandığında yeni bir Service başlatmak ve o başlatılan service içinden de başka bir activity start etmeye çalıştım.
Servisler, kullanıcı ile iletişimi olmadan arka planda çalışırlar. Önemli avantajlarından biri de birden fazla çalıştırılırsa bile tek bir tane istek olur ve çalışıtırılır. Yani ben 10 sefer de service başlat buttonuna tıklasam dahi bir tane service arka planda çalışır. Genelde timer ile thread başlatılıyor ve kendi kendine çalışırlar.
Bugün gördüğüm güzel bir cümleyi de direkt yazmak istiyorum.
“You’re only allowed to update GUI elements from the GUI thread.” Yani Runnable interfacesinden create edilen bir thread ile Timer dan create edilen bir thread ile farklı işlemler gerçekleştirlir.
Service başlatma kodu

Intent intent = new Intent();
intent.setClass(getApplicationContext(), MyService.class);
startService(intent);

MyMainActivity.java

package com.start.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyMainActivity extends Activity implements OnClickListener {
	private Button start_activity_with_service;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		start_activity_with_service = (Button) findViewById(R.id.button_start_service);
		// buttona listener ekliyorum
		start_activity_with_service.setOnClickListener(this);
	}

	// OnClickListener interfaceye ait olan bu metod button clik edildiginde
	// service baslatiyor.
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setClass(getApplicationContext(), MyService.class);
		startService(intent);
	}
}

Service içinde activity start etme kodu

Intent yeniActivityBas = new Intent(getBaseContext(),MyNewActivity.class);
yeniActivityBas.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(yeniActivityBas);

MyService.java

package com.start.activity;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.d("Cikti", "Servis is running");
		// Service icinden yeni bir MyNewActivity isimindeki activityi
		// baslatiyorum.
		Intent yeniActivityBas = new Intent(getBaseContext(),
				MyNewActivity.class);
		yeniActivityBas.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		getApplication().startActivity(yeniActivityBas);

	}
}

MyNewActivity.java

package com.start.activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MyNewActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Ekrana sadece mesaj yaziyor.
		Toast.makeText(getApplicationContext(),
				"Merhaba, Service tarafindan calisitirlan activity",
				Toast.LENGTH_LONG).show();
	}

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.start.activity"
      android:versionCode="1"
      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyMainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name="MyNewActivity"></activity>
        <service android:name="MyService"></service>

    </application>
</manifest>

Download StartActivityInService.tar.gz

Comments

There is one comment for this post.

  1. Mustafa Tekeli on Aralık 12, 2011 9:11 pm

    Yazı için teşekkür ederim. Ben bir konuda yorumunuzu öğrenmek isterim. Webden bir RSS parse eden widget yapıyorum. bu widget belli aralıklarda bu işlemi tekrarlayacak ayrıca istenirse bir text veya button aracılığıyla manuel yenilenecek. Bunun için sizce Service mi kullanmalıyım yoksa Alarm Manager mı ? Nedeni de belirtirseniz sevinirim.

Write a Comment

Let me know what you think?