android 的Service里面多次启动一个Activity只能用FLAG_ACTIVITY_NEW_TASK,那么怎么才能只启动一次呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 的Service里面多次启动一个Activity只能用FLAG_ACTIVITY_NEW_TASK,那么怎么才能只启动一次呢?相关的知识,希望对你有一定的参考价值。

具体是这样的:我有一个Service监听短信,当来短信的时候就启动一个Activity1。并且我需要在Activity2里面也启动它。怎么么样才能只启动一个?当启动的Activity1被用户按了home被置于后台了,怎么才能在来短信的时候唤起它,而不是在启动一个?

Activity只启动一次,需要设置Activity的启动模式。Activity启动模式有4种,分别为standard、singleTop、singleTask、singleInstance,只要设置为 singleTask就只会启动一次。

关于Activity四种启动模式的说明:
1.standard 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

2.singleTop 可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
3.singleTask 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
3.singleInstance只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
参考技术A 其实我不太明白你说的activity1和activity2是什么关系
但是,你可以试下,使用
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)

把前面开的那个清了
参考技术B 你为什么不注册一个接受短信的广播呢?
当有短信来时,在广播接收器里启动Activity1。Activity1使用singleTask模式。追问

有的软件有屏蔽陌生短信电话的功能。

追答

我想那你应该知道,原生的短信应用将短信息存在哪里了,还有第三方应用是否对这些数据可读。
这个功能我也没有做过,建议你可以到CSDN或者其他比较专业一点的论坛去问。

追问

我在网上查了些资料,非Activity启动Activity必须用FLAG_ACTIVITY_NEW_TASK,不知道怎样才能只开一个。

怎么在service里面启动socket服务

参考技术A 首先,实现 Socket Service。
package com.jia.leozhengfirstapp;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;

public class SocketService extends Service

private Socket clientSocket = null;
private ServerSocket mServerSocket = null;

private SocketAcceptThread socketAcceptThread = null;
private SocketReceiveThread socketReceiveThread = null;

private SocketReceiver socketReceiver;

public static final String SOCKER_ACTION = "com.jia.Socket.Control";
public static final String SOCKER_RCV = "com.jia.Socket.ReceiveStr";

private boolean stop = true;

@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;

@Override
public void onCreate()
super.onCreate();
Log.d("service", "socket service created");
socketReceiver = new SocketReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(SOCKER_ACTION);
registerReceiver(socketReceiver, filter);

socketAcceptThread www.hbbz08.com = new SocketAcceptThread();
// 开启 Socket 监听线程
socketAcceptThread.start();


@Override
public void onStart(Intent intent, int startId)
Log.d("service", "socket service start");

以上是关于android 的Service里面多次启动一个Activity只能用FLAG_ACTIVITY_NEW_TASK,那么怎么才能只启动一次呢?的主要内容,如果未能解决你的问题,请参考以下文章

怎么在service里面启动socket服务

Android如何启用Service,如何停用Service。

Android学习小记-----监听并保存传感器数据,让service后台运行(保持CPU运转

启动SSH服务出现“Failed to start sshd.service: Unit sshd.service not found.”

Android面试收集录9 IntentService详解

Android O Service AAA does not have a SELinux domain defined