2011-11-13 1 views
9

Я действительно пытался пройти через aim.putExtra() и getIntent(). GetExtras() и применить их к одному из учебных пособий SimpleService. Я знаю, что многие люди уже спрашивали: «Почему у вас всегда есть пустые объекты?» Я обещаю, что попытался взломать ответы, которые я нашел здесь в течение нескольких часов, прежде чем я рассмотрел публикацию, но я не думаю, что я достаточно продвинутый, чтобы действительно понять, что это, я должен делать неправильно с небольшими отрывками, которые публикуют люди. Таким образом, я ввел полный код своей деятельности и моей службы.Android - запуск службы с дополнительной информацией с помощью put/getExtra

Я думаю, что моя проблема в том, что мое начальное намерение (то, что я создаю в своей деятельности) не существует в контексте моей службы. Интересно, возможно ли, что я полностью использую намерения в неправильном направлении/цели? Я попробовал aim.putExtra в моей службе, чтобы попытаться отправить строку в другом направлении, но эти дополнительные функции всегда равны нулю. Так что, рискуя повторения, почему пустые дополнения всегда равны нулю? Как я могу сделать одно намерение, которое существует как в контексте моей деятельности, так и моей службы?

Следует отметить, что код, показанный ниже, очевидно, будет иметь нулевые дополнения, потому что я прокомментировал некоторые из моих попыток .getExtras(), которые потерпели неудачу. Я удалил все остальное ради чистоты.

РЕДАКТИРОВАТЬ: Ответ благодаря ответам, в коде для тех, кто также работал в Google в течение нескольких часов. Поместите это в службе (обратите внимание, что возвращение START_REDELIVER_INTENT может быть неправильным):

@Override 
public int onStartCommand(Intent intent , int flags , int startId) 
{ 
     super.onStartCommand(intent, flags , startId); 

     extras = intent.getExtras(); 

      //just checking 
     if(extras != null) 
     Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show(); 

     return START_REDELIVER_INTENT; 

} 

Моя активность (на основе блога Саи Гита в):

package com.example.BroadcastIntent; 

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; 
import android.widget.Toast; 

public class BroadcastIntentActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button start = (Button)findViewById(R.id.buttonStart); 
    start.setOnClickListener(startListener); 

    Button stop = (Button)findViewById(R.id.buttonStop); 
    stop.setOnClickListener(stopListener); 

    //the intent I'm using to start and stop the service -- the extras don't go anywhere.... 
    intent = new Intent(BroadcastIntentActivity.this,BroadcastService.class);  
    intent.putExtra("extratoservice", "if you can read this, it made it to the service"); 

} 

Boolean serviceRunning; 
Intent intent; 

//Clicks from Geetha's Blog 
private OnClickListener startListener = new OnClickListener() { 
    public void onClick(View v){ 

     startService(intent); 
     serviceRunning = true; 
    }     
}; 

private OnClickListener stopListener = new OnClickListener() { 
    public void onClick(View v){ 

     try 
     { 
      stopService(intent); 
      serviceRunning = false;     
     } 
     catch(Exception e) 
     { 
      Toast.makeText(getApplicationContext(), "Service was not running...",Toast.LENGTH_SHORT).show(); 
     } 
    }     
}; 

} 

И это моя служба:

package com.example.BroadcastIntent; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.widget.Toast; 

public class BroadcastService extends Service{ 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 

    //extras = arg0.getExtras(); <-- this has null extras, too... 

    return null; 
} 

Bundle extras; 

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

     // extras = getIntent().getExtras(); <-- this is undefined? 

     if(extras == null) 
     Toast.makeText(this,"Service created... extras still null", Toast.LENGTH_SHORT).show(); 
     else 
     Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show(); 

} 

@Override 
public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_SHORT).show(); 

} 
} 
+0

Добро пожаловать в Stackoverflow! Если вы найдете ответ полезным, пожалуйста, проголосуйте за него. Если ответ успешно отвечает на ваш вопрос, нажмите зеленую галочку рядом с ним, чтобы принять ответ. Также посмотрите http://stackoverflow.com/questions/how-to-ask за советом о том, как написать хороший вопрос. –

+0

Kurtis, мне нравится ваше приглашение на акции! Я рад, что кто-то тратит время, чтобы сообщить новым прибывшим о том, как пользоваться услугой :) –

+0

@Adam: Я не понимаю, извините: ваш код обслуживания в конце не имеет 'onStartCommand()' ?? –

ответ

12

вам нужно посмотреть на функцию onStartCommand() (я не на рабочем столе, поэтому я не могу удобно ссылаться на javadoc). Это получит намерение, которое вы прошли, и ваши дополнительные услуги должны быть доступны там.

+0

Nice - теперь, чтобы выяснить, как отправить сообщение назад. – Adam

+0

Спасибо за подключение URL @ H9kDroid. Что касается ответа, у вас есть несколько вариантов: либо использовать BroadcastReceiver, либо использовать onBind. – Femi

+0

Возможно, что-то плохое, что я могу сделать - поскольку моя служба работает в том же процессе (я думаю?) В качестве моего приложения, я могу фактически получить/изменить любые общедоступные переменные, которые я хотел бы ... это " d - плохая идея для запуска службы как реальной службы, но она работает для моих простых целей. – Adam

1

Я думаю, что вам нужно сделать это в вашей службе ..

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

получить намерение вы передаете в ... но я не 100% на этом, поэтому двойную проверку http://developer.android.com/reference/android/app/Service.html

+0

Это работает, спасибо. Кстати, кажется, мне нужно дождаться, когда onCommand() произойдет после onCreate(). Затем я могу получить дополнительные услуги. – Adam

+0

Тебе очень рады, рад, что смогу помочь. –

+0

Из документации: Это старый метод onStart, который будет вызываться на платформе до 2.0. В версии 2.0 или более поздней версии мы переопределяем onStartCommand(), поэтому этот метод не будет вызываться. –

Смежные вопросы