[英]Android call method in Service from Activity
我想從Activity
對象調用Service
對象中的方法,但是我發現無法從MainActivity
正常調用該方法。
我希望我的代碼能更好地解釋我的意思:
服務:
public class Timer extends Service {
public Vibrator v;
public MainActivity ma;
public CountDownTimer mycounter;
public static final String MY_SERVICE = "de.example.timer.MY_SERVICE";
public IBinder onBind(Intent arg0)
{
return null;
}
public void onCreate()
{
super.onCreate();
ma = new MainActivity();
v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
startService();
}
public void startService()
{
mycounter = null; //delete counter
mycounter = new CountDownTimer(5000, 100){
public void onTick(long millisUntilFinished) {
//ma.timer.setText(ma.formatTime(millisUntilFinished+1000));
//ma.builder.setContentText("Timer: " + ma.formatTime(millisUntilFinished+1000)); //update Timer
//ma.notificationManager.notify(MainActivity.MY_NOTIFICATION_ID, ma.builder.build());
//It is not possible to call a methode this way in a service..
}
public void onFinish() {
//ma.timer.setText("00:00:00");
v.vibrate(1000);
mycounter.cancel();
mycounter.start();
}
};
mycounter.start();
}
public void onDestroy()
{
super.onDestroy();
mycounter.cancel();
}
}
活動:
public class MainActivity extends Activity {
private ImageButton imagebutton;
public Vibrator v;
public TextView timer;
public boolean pressed;
public String output;
public long waitingtime;
public Timer service;
public static final int MY_NOTIFICATION_ID = 1;
public NotificationManager notificationManager;
public Context context;
public Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
pressed = false;
waitingtime = 600000; // Standartmäßig auf 10 min
v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
imagebutton = (ImageButton) findViewById(R.id.imageButton1);
imagebutton.setBackgroundResource(R.drawable.start);
timer = (TextView) findViewById(R.id.timer);
timer.setText(formatTime(waitingtime));
Intent intent = new Intent (this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pend = PendingIntent.getActivity(this, 0, intent, 0);
notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
context = getApplicationContext();
builder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.notlogosmall)
.setContentTitle("Start!")
.setContentText("Timer set to " + waitingtime/1000 + " seconds")
.setContentIntent (pend)
.setTicker("Go!")
.setWhen(System.currentTimeMillis())
.setDefaults(0)
.setAutoCancel(false)
.setOngoing(true);
}
public void press(View view){
if(pressed == false){
imagebutton.setBackgroundResource(R.drawable.stop);
pressed = true;
notificationManager.notify(MY_NOTIFICATION_ID, builder.build()); //Notification
v.vibrate(100);
hidebuttons();
startService(new Intent(Timer.MY_SERVICE));
}
else{
imagebutton.setBackgroundResource(R.drawable.start);
pressed = false;
notificationManager.cancel(1);
timer.setText(formatTime(waitingtime));
showbuttons();
stopService(new Intent(Timer.MY_SERVICE));
v.vibrate(100);
}
}
如何從另一個類的對象調用一個對象的方法?
接受的答案沒有錯,但非常不必要地復雜。
將此添加到活動中:
Intent i = new Intent(this, SERVICE_NAME.class);
i.setAction("YOUR_ACTION");
startService(i);
這對服務:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && intent.getAction() != null && intent.getAction().equals("YOUR_ACTION")) {
invokeServiceMethod(); // here you invoke the service method
}
return START_STICKY; // or whatever floats your boat
}
一個簡單的方法是從 Activity 發送一個意圖並在服務的 onStartCommand() 方法中處理它。 不要忘記提供具有正確動作/附加功能的意圖並在 onStartCommand() 中檢查
編輯:
活動:
添加一個私有類:
private class CustomReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_CUSTOM_ACTION)) {
doCustomAction();
}
}
}
添加私有字段:
private CustomReceiver mCustomReceiver;
在 onCreate() 方法中:
mCustomReceiver = new CustomReceiver();
在 onResume() 或其他生命周期方法中:
IntentFilter filter = new IntentFilter(ACTION_CUSTOM_ACTION);
registerReceiver(mCustomReceiver , filter);
在 onPause() 或其他配對(到上一步)生命周期方法中
unregisterReceiver(mCustomReceiver );
在活動中,只要您想調用 use Service 方法:
startService(new Intent(SOME_ACTION));
服務中:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
return START_STICKY;
}
String action = intent.getAction();
if (action == null) {
return START_STICKY;
} else if (action.equals(SOME_ACTION)) {
invokeSomeServiceMethod();// here you invoke service method
}
return START_STICKY;
}
請注意, START_STICKY
可能不是您的最佳選擇,請閱讀文檔中的模式。
然后,當您想通知活動您已完成時,請調用:
startActivity(ACTION_CUSTOM_ACTION);
這將觸發廣播接收器,您可以在其中處理完成事件。
看起來這是很多代碼,但實際上沒有什么困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.