gpt4 book ai didi

android - 通过返回按钮关闭应用程序时后台服务停止

转载 作者:行者123 更新时间:2023-11-29 01:43:45 25 4
gpt4 key购买 nike

当用户使用“返回”按钮退出应用程序时,Android 中的后台服务将停止运行。如果应用程序在前台或后台(单击主页按钮),相同的服务工作正常。

有3种情况:

  1. 保持应用程序运行:每 15 秒显示一次通知(确定)。
  2. 通过单击主页按钮将应用程序置于后台:通知继续显示(确定)
  3. 点击“返回”按钮(这将关闭应用):后台服务停止,不再显示通知(BUG)

预期行为

同样在案例 #3 中,通知应该每 15 秒运行一次。

我的全部来源在下面

MainActivity.java

    package com.example.service_demo;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

private TextView timerValue;
private Button startTimer;
private Button cancleTimer;
Intent i;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapview();

}

private void mapview() {

timerValue = (TextView) findViewById(R.id.timertext);
startTimer = (Button) findViewById(R.id.starttimer);
cancleTimer = (Button) findViewById(R.id.cancletimer);
startTimer.setOnClickListener(this);
cancleTimer.setOnClickListener(this);
}

@Override
protected void onResume() {
super.onResume();
i = new Intent(this, SimpleService.class);
if (isMyServiceRunning()) {
Toast.makeText(getBaseContext(), "Service is running,",
Toast.LENGTH_SHORT).show();
registerReceiver(broadcastReceiver, new IntentFilter(
SimpleService.BROADCAST_ACTION));
startTimer.setEnabled(false);
} else {
Toast.makeText(getBaseContext(), "There is no service running",
Toast.LENGTH_SHORT).show();
}

}

@Override
public void onClick(View v) {
if (v == startTimer) {
startTimer.setEnabled(false);
i = new Intent(this, SimpleService.class);
startService(i);
registerReceiver(broadcastReceiver, new IntentFilter(
SimpleService.BROADCAST_ACTION));
} else if (v == cancleTimer) {
i = new Intent(this, SimpleService.class);
stopService(i);
timerValue.setText("00:00:00");
startTimer.setEnabled(true);

}
}

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {

updateUI(intent);
}

};

private void updateUI(Intent intent) {
String str = intent.getStringExtra("textval");
timerValue.setText(str);

}

private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager
.getRunningServices(Integer.MAX_VALUE)) {
if (SimpleService.class.getName().equals(
service.service.getClassName())) {
return true;
}
}
return false;
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
i = new Intent(this, SimpleService.class);
startService(i);
}

@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
System.exit(0); // system.exit(0) is mendatory for my app so it can't be
// removed
}

}

简单服务

    package com.example.service_demo;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class SimpleService extends Service {

private NotificationManager mNM;
private long startTime = 0L;
long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;
long basestart = System.currentTimeMillis();
Timer timer = new Timer();
long timeswap = 0L;
int secs = 0;
int mins = 0;
int hour = 0;
Intent intent;
String s;
public static final String BROADCAST_ACTION = "com.example.service_demo.MainActivity";
private int NOTIFICATION = 1;

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

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

mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
intent = new Intent(BROADCAST_ACTION);
Toast.makeText(this, "Service Started", 2000).show();

}

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

Thread t = new Thread(new Runnable() {

@Override
public void run() {
timer.schedule(new RemindTask(), 0, 1000);
}
});
t.start();

return Service.START_NOT_STICKY;

}

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

mNM.cancel(NOTIFICATION);

if (timer != null) {
timer.cancel();
timer.purge();
timer = null;
}
Toast.makeText(this, "Service Stoped", 2000).show();
}

class RemindTask extends TimerTask {

@Override
public void run() {

timeInMilliseconds = System.currentTimeMillis() - basestart;
timeSwapBuff = timeswap;
updatedTime = timeSwapBuff + timeInMilliseconds;

secs = (int) (updatedTime / 1000);
mins = secs / 60;
hour = mins / 60;

secs = secs % 60;
mins = mins % 60;

s = "" + String.format("%02d", hour) + ":" + ""
+ String.format("%02d", mins) + ":"
+ String.format("%02d", secs);
if (s.equalsIgnoreCase("00:00:15")) {
showNotification();
}
intent.putExtra("textval", s);
sendBroadcast(intent);
}
}

private void showNotification() {
// In this sample, we'll use the same text for the ticker and the
// expanded notification
CharSequence text = s;

// Set the icon, scrolling text and timestamp
@SuppressWarnings("deprecation")
Notification notification = new Notification(R.drawable.ic_launcher,
text, System.currentTimeMillis());

// The PendingIntent to launch our activity if the user selects this
// notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), 0);

// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this, "Notification Label", text,
contentIntent);

// Send the notification.
mNM.notify(NOTIFICATION, notification);
}

}

最佳答案

在服务的方法onStartCommand()中,返回START_STICKY。该服务将继续运行,直到您在服务中明确调用 stopSelf() 或从您的 Activity 中调用 stopService()

关于android - 通过返回按钮关闭应用程序时后台服务停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22780941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com