我尝试提供Android服务。
所以我使用服务扩展类。
public class DelayedToast extends IntentService {
private final static boolean Debug = true;
private final static String TAG = "ALT";
public DelayedToast() {
super("DelayedToast");
}
@Override
protected void onHandleIntent(Intent intent) {
final int delay = intent.getIntExtra("delay", -1);
if (Debug) Log.i(TAG, "DelayedToast:onHandleIntent delay: " + delay);
if (delay > 0) {
SystemClock.sleep(delay * 1000);
if (Debug) Log.i(TAG, "Wake up !! ");
// Intent broadcastIntent = new Intent();
Intent broadcastIntent = new Intent(getApplicationContext(), Receiver.class); // Need to be explicit for Broadcast : https://stackoverflow.com/questions/55610977/why-a-static-broadcastreceiver-not-working
broadcastIntent.setAction(getString(R.string.intent_action));
broadcastIntent.putExtra("delay", delay);
sendBroadcast(broadcastIntent);
if (Debug) Log.i(TAG, "sendBroadcast");
showToast("toast Service: " + delay);
}
}
// https://stackoverflow.com/a/34832674
protected void showToast(final String msg) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
if (Debug) Log.i(TAG, msg);
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}
});
}
}
我已经在清单上声明了这一点。
<service
android:name=".DelayedToast"
android:enabled="true"
android:exported="true"
android:process=":DelayedToast" />
我使用Button启动服务:
public void onClickStart(View v) {
EditText editText = findViewById(R.id.delay);
final String str_delay = editText.getText().toString();
if (Debug) Log.i(TAG, "MainActivity:onClickStart str: " + str_delay);
if (!str_delay.isEmpty()) {
final int delay = Integer.parseInt(str_delay);
if (Debug) Log.i(TAG, "Q1_MainActivity:onClickStart delay: " + delay);
if (delay > 0) {
Intent intent = new Intent(this, DelayedToast.class);
intent.putExtra("delay", delay);
startService(intent);
}
}
}
C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //这里 应用程序没有启动
C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //应用程序正在运行
u0_a246 20032 3012 2569888 132044 0 0 S test.tp08
C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //我是 启动“延迟吐司”(服务)
u0_a246 20032 3012 2573316 135404 0 0 S test.tp08
u0_a246 20090 3012 2324660 79876 0 0 S test.tp08:DelayedToast
C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //我 收到了Broacast Intet
u0_a246 20032 3012 2580964 137252 0 0 S test.tp08
u0_a246 20090 3012 2326168 96376 0 0 S test.tp08:DelayedToast
u0_a246 20127 3012 2325228 99696 0 0 S test.tp08:接收器
C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //这里 我已经申请了,服务也被取消了
C:\ Users \ dark_vidor>
我遵循了一些教程,但我不明白自己忘记了什么,为什么退出服务后我的服务会被杀死,而他应该留下来直到我停止它 我正在使用Samsung A8,我的应用程序是Java,SDK 24分钟以上
您是否有解决此问题的主意?
答案 0 :(得分:0)
服务 这是所有服务的基类。扩展此类时,创建一个新线程以使服务可以完成其所有工作非常重要。该服务默认情况下使用应用程序的主线程,这可能会降低应用程序正在运行的任何活动的性能。
IntentService 这是Service的子类,它使用辅助线程来一次处理所有启动请求。如果您不需要服务同时处理多个请求,则这是最佳选择。实现onHandleIntent(),该方法接收每个启动请求的意图,以便您可以完成后台工作。
如果需要长期运行,请扩展Service而不是IntentService。