2011-11-13 8 views
9

Tôi đã thực sự cố gắng vượt qua intent.putExtra() và getIntent(). GetExtras() và áp dụng chúng vào một trong các hướng dẫn SimpleService. Tôi biết rất nhiều người đã hỏi "tại sao gói bổ sung luôn rỗng?" Tôi hứa tôi đã cố gắng để hack thông qua các câu trả lời tôi tìm thấy ở đây trong vài giờ trước khi tôi xem xét đăng bài nhưng tôi không nghĩ rằng tôi đủ tiên tiến để thực sự hiểu những gì tôi phải làm sai với các đoạn nhỏ người đăng. Vì vậy, tôi đưa vào toàn bộ mã hoạt động của tôi và dịch vụ của tôi.Android - Bắt đầu một dịch vụ với thông tin bổ sung thông qua put/getExtra

Tôi nghĩ rằng vấn đề của tôi là ý định bắt đầu của tôi (mục tôi tạo ra trong hoạt động của mình) không tồn tại trong ngữ cảnh dịch vụ của tôi. Tôi tự hỏi liệu có lẽ tôi đang sử dụng Intents theo hướng sai mục đích? Tôi đã thử một intent.putExtra trong dịch vụ của mình, để cố gắng gửi một chuỗi theo hướng khác, nhưng những tính năng bổ sung đó luôn luôn là null. Vì vậy, với nguy cơ lặp lại, tại sao các gói bổ sung luôn rỗng? Làm cách nào để tạo một mục đích duy nhất tồn tại cả trong ngữ cảnh hoạt động của tôi và dịch vụ của tôi?

Tôi nên lưu ý rằng mã như được hiển thị bên dưới rõ ràng sẽ có phần bổ sung rỗng vì tôi đã nhận xét một số nỗ lực của tôi đối với .getExtras() đã thất bại. Tôi đã xóa phần còn lại vì lợi ích của sự sạch sẽ.

CHỈNH SỬA: Câu trả lời nhờ các câu trả lời, trong mã vì lợi ích của những người cũng đã được Googling trong nhiều giờ. Đặt điều này trong dịch vụ của bạn (xin lưu ý rằng các START_REDELIVER_INTENT trở lại có thể sai):

@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; 

} 

hoạt động của tôi (dựa trên blog của Sài Geetha của):

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(); 
     } 
    }     
}; 

} 

Và đây là dịch vụ của tôi:

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

Chào mừng bạn đến với Stackoverflow! Nếu bạn tìm thấy câu trả lời hữu ích, vui lòng bỏ phiếu. Nếu câu trả lời thành công trả lời câu hỏi của bạn, vui lòng nhấp vào dấu kiểm màu xanh bên cạnh để chấp nhận câu trả lời. Ngoài ra, hãy xem http://stackoverflow.com/questions/how-to-ask để được tư vấn về cách viết một câu hỏi hay –

+0

Kurtis, tôi thích lời mời cổ phiếu của bạn! Tôi rất vui vì ai đó đã dành thời gian để thông báo cho những khách hàng mới về cách sử dụng dịch vụ :) –

+0

@Adam: Tôi không hiểu, xin lỗi: mã dịch vụ của bạn ở cuối không có 'onStartCommand()' ?? –

Trả lời

12

bạn cần xem xét chức năng onStartCommand() (Tôi không ở trên máy tính để bàn vì vậy tôi không thể liên kết thuận tiện với javadoc). Điều này sẽ nhận được ý định bạn đã vượt qua và tính năng bổ sung của bạn sẽ khả dụng ở đó.

+0

Tốt - bây giờ hãy tìm cách gửi lại tin nhắn. – Adam

+0

Cảm ơn URL hookup @ H9kDroid. Theo như trả lời, bạn có một vài lựa chọn: sử dụng BroadcastReceiver hoặc sử dụng onBind. – Femi

+0

Có thể tôi đã nhận ra rằng mình có thể làm được - vì dịch vụ của tôi đang chạy trong cùng một quy trình (tôi nghĩ?) Là ứng dụng của mình, tôi thực sự có thể truy cập/thay đổi bất kỳ biến công khai nào mà tôi muốn ... d là một ý tưởng tồi để chạy một dịch vụ như một dịch vụ thực sự - nhưng nó hoạt động cho các mục đích hướng dẫn đơn giản của tôi. – Adam

1

Tôi nghĩ rằng bạn cần phải làm điều này trong dịch vụ của bạn ..

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

để có được mục đích bạn đang đi qua trong ... nhưng tôi không chắc chắn 100% về vấn đề này, vì vậy kiểm tra lại http://developer.android.com/reference/android/app/Service.html

+0

Nó hoạt động, cảm ơn. Ngẫu nhiên, có vẻ như tôi phải đợi onCommand() xảy ra sau onCreate(). Sau đó, tôi có thể nhận được các tính năng bổ sung. – Adam

+0

bạn được chào đón nhiều nhất, vui vì tôi có thể giúp đỡ. –

+0

Từ tài liệu: Đây là phương thức onStart cũ sẽ được gọi trên nền tảng trước 2.0. Ngày 2.0 hoặc mới hơn, chúng tôi ghi đè lên onStartCommand() để phương thức này sẽ không được gọi. –