13 Kasım 2016 Pazar

Intent Sınıfı

Intent
Intent service, pencere başlatmak için kullanılabilir. Intent içinde iki alan var. Bunlar data ve extra alanları. data alanı iki activity arasında Uri geçmek için kullanılır. extra alanı iki activity arasında veri geçmek için kullanılır.

data Alanı
data alanı Uri barındırır.

extra Alanı
extra alanı bir Bundle nesnesidir. Bundle nesnesine extras metodları ile erişiriz. Bundle, Parcelable arayüzünden kalıtan nesneleri saklayabilir. Parcelable nesnesinin boyutu belli bir üst sınırı aşmamalıdır. Sanırım 1 MB. Eğer bu sınır aşılıyorsa, veri başka bir yöntemle - mesela file olarak - aktarılmalı.

constructor
Şöyle yaparız.
Intent intent = new Intent ();
constructor - Context + Class
Şöyle yaparız.
Intent intent = new Intent(MyActivity1.this, MyActivity2.class);
addFlags metodu
İlk activity sınıfını stack'ten çıkartmak için şöyle yaparız.
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
hasExtra metodu
Verilen isme dahip bir Parcelable oldup olmadığını döner. Şöyle yaparız.
if(intent.hasExtra("byteArray")) {...}
getByteArrayExtra metodu
Şöyle yaparız.
intent().getByteArrayExtra("byteArray")
getData metodu
Uri döner. Örnek ver.

getExtras metodu
Bundle nesnesi döner. Şöyle yaparız.
Bundle bundle = intent.getExtras();
getIntExtra metodu
Şöyle yaparız.
int musicOn = intent.getIntExtra("music on",0);
getParcelableArrayListExtra metodu
Belirtilen isme sahip Parcelable nesnesini döner. Şöyle yaparız.
ArrayList<QuestionResult> questions = getIntent().getParcelableArrayListExtra
("FailedResult");
getParcelableExtra metodu
Belirtilen isme sahip Parcelable nesnesini döner. Şöyle yaparız.
intent.getParcelableExtra("Bitmap")
getSerializableExtra metodu
Şöyle yaparız.
ArrayList<String> list = (ArrayList<String>) intent.getSerializableExtra("key");
getStringArrayListExtra metodu
Şöyle yaparız.
ArrayList<String> list = getIntent().getStringArrayListExtra("key")
getStringExtra metodu
Belirtilen isme sahip Parcelable nesnesini döner. Şöyle yaparız
String user_message = intent.getStringExtra("Text"));
putExtra metodu
İsmi olan bir Parcelable ekler.

Byte dizisi için şöyle yaparız.
ByteArrayOutputStream bs = new ByteArrayOutputStream();
intent.putExtra("byteArray", bs.toByteArray());
Class için şöyle yaparız.
intent.putExtra("myActivity", Activity2.class);
Int için şöyle yaparız.
int i = 100;
intent.putExtra("LAUNCH_TARGET", i);
String için şöyle yaparız.
String str = ...;
intent.putExtra("string", str);
putExtras metodu
Şöyle yaparız.
Bundle bundle = ...;
intent.putExtras (bundle);
putParcelableArrayListExtra metodu
İsmi olan bir Parcelable ekler. Elimizde şöyle bir liste olsun
ArrayList<QuestionFialed> failedQuestions;
Bu sınıf şu arayüzden kalıtmalıdır.
public class QuestionFailed implements Parcelable {
...
}
Şöyle yaparız
intent.putParcelableArrayListExtra("FailedResult", failedQuestions);
Diğer activity içinde şöyle erişiriz.
ArrayList<QuestionResult> questions = getIntent().getParcelableArrayListExtra
("FailedResult");
putStringArrayListExtra metodu
Şöyle yaparız.
ArrayList<String> list = ...;
intent.putStringArrayListExtra("key", list);
startActivity İle Yapılabilecek Şeyler
Pencere Başlatmak
Pencere başlatmak için startActivity() ile kullanılır. Bu durumda Constructor metodu iki parametre alır. Kaynak ve Hedef. Mesela ana pencereden login penceresini açmak için şöyle intent nesnesi şöyle yaratılır.
Intent intent= new Intent(MainActivity.this,LoginActivity.class);
Daha sonra startActivity() metodu çağrılır.
Intent intent = new Intent(FirstActivity.this,OrderScreen.class);
startActivity(intent);
GPS'i Açmak
Şöyle yapılır
startActivity(new Intent(
              android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
E-Posta Göndermek
Intent e-posta gönderilirken kullanılır. Intent doldurulduktan sonra e-posta uygulamalarından birisi seçilerek gönderilir.
Intent emailIntent = new Intent(Intent.ACTION_SEND); 
...
//let the user choose what email client to use
startActivity(Intent.createChooser(emailIntent, "Send mail using...")); }
Intent.createChooser yerine şöyle de yapılabilir. Ancak ben bunu sevmiyorum.
ResolveInfo r = ...;
emailIntent.setClassName(r.activityInfo.packageName, r.activityInfo.name);
E-posta'nın diğer alanları şöyle doldurulur.
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"abc@gmail.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Reminder");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Null");
Dosya eklentisi için şöyle yaparız.
File file = ...;
Uri uri = Uri.fromFile(file);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
Dosya Açmak
Bir dosya gösterilebilir.
private void openScreenshot(File imageFile) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(imageFile);
    intent.setDataAndType(uri, "image/*");
    startActivity(intent);
}
startActivityForResult İle Yapılabilecek Şeyler
Başka Uygulama Başlatmak
A uygulaması, B uygulamasını şöyle başlatabilir. B uygulamasından yeni bir tane yaratılıp yaratılmayacağı B uygulamasının launchMode alanında belirtilir.

Camera açılabilir.
Şöyle yaparız
Intent imageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File imagesFolder =new File(Environment.getExternalStorageDirectory(),"MyImages");
if(imagesFolder.mkdirs()){
  Log.d(TAG, "The directory is created");
} else {
  Log.d(TAG, "Failed or already exists");
}
File image = new File(imagesFolder, "image_001.jpg");
try {
  if(image.createNewFile()){
    Log.d(TAG, "The file is created");
  } else {
    Log.d(TAG, "The file already exists");
  }
} catch (IOException e) {
  Log.e(TAG, "createNewFile Failed");
  e.printStackTrace();
}
imageUri = Uri.fromFile(image);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(imageIntent, REQUEST_CODE_FROM_CAMERA);
Kamerayı başlatan uygulama sonucu şöyle alır
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_CODE_FROM_CAMERA &&
      resultCode == Activity.RESULT_OK){
    ...
  }
}
Galeriden Resim Seçmek 1
Şöyle yaparız.
Intent intent = new Intent(Intent.ACTION_PICK, 
                           MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(GaleryIntent, RESULT_LOAD_IMAGE);
Sonuç şöyle alınır.
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK) {
    Uri SelectedImage = data.getData();
    ...
  }
} 

Galeriden Resim Seçmek 2
Şöyle yaparız. Bu sefer Intent.createChooser kulllanıyoruz. Benzer bir kod örneği de burada
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Choose"), 1);
setType için resim yanında pdf de seçmek isteseydik şöyle de yapabilirdik.
i.setType("image/*|application/pdf|audio/*");
Eğer sadece açılabilen dosyalar olduğundan emin olmak istersek şöyle yaparız.
intent.addCategory(Intent.CATEGORY_OPENABLE);
Sonuç şöyle alınır
public void onActivityResult(int reqCode, int resCode, Intent data){
  if(resCode == Activity.RESULT_OK){
    if(reqCode == 1){
      btn1.setImageURI(data.getData());
    }
  }
}
Galeriden Çoklu Resim Seçmek 3
Yukarıdaki örnek ile benzer. Intent için şu kodu ekleriz.
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
Çoklu resim seçildiği için onActivityResult haliyle biraz daha farklı olacaktır.

Settings - Ayarları Açmak
Şöyle yaparız.
startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);




Hiç yorum yok:

Yorum Gönder