如何防止Android中的后台服务被强制停止?

如何防止Android中的后台服务被强制停止?,android,service,Android,Service,我需要一些帮助来创建一个即使应用程序被用户强制停止也可以在后台运行的服务。那我该怎么做呢?有人能帮我吗? 下面我也给出了我开发的服务代码 public class LogManager_Service extends Service { DatabaseHandler db; Intent intent; Context context = this; // calls String phonenumber; String callId = "", nu

我需要一些帮助来创建一个即使应用程序被用户强制停止也可以在后台运行的服务。那我该怎么做呢?有人能帮我吗? 下面我也给出了我开发的服务代码

public class LogManager_Service extends Service {

    DatabaseHandler db;
    Intent intent;
    Context context = this;
// calls
    String phonenumber;
    String callId = "", number = "", call_type = "", call_datetime = "";
    String dir = "";
// sms-mms
    String direction = "";
    String address = "";
    String Type, cnt_type;
    boolean isIncoming = false;
    int smsID, outsmsId;
    Long timestamp, sms_timestamp_in, sms_timestamp_out;
    long aftertime;
    Cursor cu;
    private static Timer timer = new Timer();

    static boolean ring = false;
    static boolean callReceived = false;

    SharedPreferences my_date_Prefs;

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

    @Override
    public void onCreate() {
// TODO Auto-generated method stub
        super.onCreate();

        my_date_Prefs = PreferenceManager.getDefaultSharedPreferences(this);

        db = new DatabaseHandler(context);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
        super.onStartCommand(intent, flags, startId);

        aftertime = my_date_Prefs.getLong("ApplicationStrat_time", 0);
        timer.scheduleAtFixedRate(new mainTask(), 0, 1000);
        System.out.println("<==========Service Start==========>");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
// TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    public void onRebind(Intent intent) {
// TODO Auto-generated method stub
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
        return super.onUnbind(intent);
    }



    private class mainTask extends TimerTask {
        public void run() {
            toastHandler.sendEmptyMessage(0);
        }
    }

    private final Handler toastHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            Uri myMessage1 = Uri.parse("content://sms/sent");
            ContentResolver cr1 = getContentResolver();
            Cursor c1 = cr1.query(myMessage1, new String[] {"_id", "address", "date", "body","read" }, null, null, null);
            if (c1 != null) {

                try {
                    int count = c1.getCount();
                    if (count > 0) {
                        c1.moveToFirst();
                        number = c1.getString(1);
                        Type = "OS";
                        String sms_date_out = c1.getString(2);
                        String substr = sms_date_out.substring(sms_date_out.length() - 3);
                        outsmsId = Integer.parseInt(substr);
                        String sms_body = c1.getString(3);
                        System.out.println("SMS Date Normal for SENT ======>"+ sms_date_out);
                        sms_timestamp_out = Long.parseLong(sms_date_out);
                        if (sms_timestamp_out >= aftertime ) {
                            addSMS(outsmsId, number, Type,  sms_timestamp_out,sms_body, "");
                        }

                    }

                } finally {
                    c1.close();
                }
            }

        }
    };  

    private void addSMS(int smsID, String number, String type,Long sms_timestamp_in, String sms_body, String call_duration) {
// TODO Auto-generated method stub
        System.out.println("smsID ====>" + smsID);
        System.out.println("number ====>" + number);
        System.out.println("type ====>" + type);
        System.out.println("sms_timestamp_in ====>" + sms_timestamp_in);
        System.out.println("sms_body ====>" + sms_body);
        db.addSMSDetails(smsID, number, type, sms_timestamp_in, sms_body,call_duration);
        db.close();
    }
}
public class LogManager\u服务扩展了服务{
数据库处理程序数据库;
意图;
上下文=这个;
//召唤
字符串电话号码;
字符串callId=“”,number=“”,call_type=“”,call_datetime=“”;
字符串dir=“”;
//短信息和彩信
字符串方向=”;
字符串地址=”;
字符串类型,cnt_类型;
布尔isIncoming=false;
int smsID,OUTSMID;
长时间戳、短消息时间戳、短消息时间戳;
漫长的后世;
光标cu;
专用静态计时器=新计时器();
静态布尔环=假;
静态布尔callReceived=false;
共享引用我的日期优先;
@凌驾
公共IBinder onBind(意图arg0){
//TODO自动生成的方法存根
返回null;
}
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
my_date_Prefs=PreferenceManager.GetDefaultSharedReferences(此选项);
db=新数据库处理程序(上下文);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
super.onStartCommand(intent、flags、startId);
aftertime=my_date_Prefs.getLong(“应用策略时间”,0);
timer.scheduleAtFixedRate(newmaintask(),0,1000);
System.out.println(“”);
返回开始时间不粘;
}
@凌驾
公共空间{
//TODO自动生成的方法存根
super.ondestory();
}
@凌驾
重新绑定时的公共无效(意图){
//TODO自动生成的方法存根
super.onRebind(意图);
}
@凌驾
公共布尔onUnbind(意图){
//TODO自动生成的方法存根
返回super.onUnbind(intent);
}
私有类mainTask扩展TimerTask{
公开募捐{
toastHandler.sendEmptyMessage(0);
}
}
私有最终处理程序toastHandler=新处理程序()
{
@凌驾
公共无效handleMessage(消息消息消息)
{
Uri myMessage1=Uri.parse(“content://sms/sent");
ContentResolver cr1=getContentResolver();
游标c1=cr1.query(myMessage1,新字符串[]{“\u id”,“address”,“date”,“body”,“read”},null,null,null);
如果(c1!=null){
试一试{
int count=c1.getCount();
如果(计数>0){
c1.移动到第一个();
number=c1.getString(1);
Type=“OS”;
字符串sms\u date\u out=c1.getString(2);
String substr=sms\u date\u out.substring(sms\u date\u out.length()-3);
outsmsId=Integer.parseInt(substr);
字符串sms_body=c1.getString(3);
System.out.println(“发送的短信正常日期====>”+短信日期=u out);
sms_timestamp_out=Long.parseLong(sms_date_out);
如果(sms\u时间戳\u out>=后时间){
添加短信(outsmsId、号码、类型、短信时间戳、短信正文“);
}
}
}最后{
c1.关闭();
}
}
}
};  
私有无效添加sms(int smsID、字符串编号、字符串类型、长sms\u时间戳\u in、字符串sms\u正文、字符串调用\u持续时间){
//TODO自动生成的方法存根
System.out.println(“smsID==>”+smsID);
System.out.println(“编号==>”+编号);
System.out.println(“type==>”+type);
System.out.println(“sms\u timestamp\u in===>”+sms\u timestamp\u in);
System.out.println(“sms\u body===>”+sms\u body);
db.addSMSDetails(smsID、号码、类型、短信时间戳、短信正文、通话持续时间);
db.close();
}
}
但是通过使用这段代码,我无法使服务在后台保持活动状态。当我强制停止应用程序时,服务也会停止。我想让服务在后台保持活动状态。

如果“强制停止”是指用户在应用程序的设置页面中按“强制停止”,则应用程序已停止。时期你无法阻止这种情况

此外,在用户手动运行您的某个组件之前,您的应用程序将永远不会在此设备上再次运行。通常,这是通过启动您的某个活动


START\u STICKY
在某些版本的Android上有助于更“随意”的场景,例如用户从最近的任务列表中刷走你的应用程序(尽管据报道这在Android 4.4上不起作用,并且不清楚这是故意的还是操作系统中的错误)。

在onStartCommand()上设置“return START\u STICKY”,而不是返回START_NOT_STICKY。

plz发布您的startservice和stopservice活动实现。private void StartApp(){//TODO自动生成的方法存根intent=new intent(MainActivity.this,LogManager_Service.class);startservice(intent);}你什么时候调用stopservice的?你确定你的服务类被调用了吗?是的,我的服务是启动的,但到底发生了什么,当我从最近的任务或设置中滑动活动时,如果我是强制停止应用程序,我的服务也会停止。我希望在应用程序强制停止时保持服务活动。非常感谢你的帖子。但是你知道在后台保持服务活动的其他方法吗?@PragneshSoni:不。用户,按“强制停止”,明确表示用户不希望您的应用程序运行,Android赋予用户停止您的应用程序并阻止其再次运行的权利。公司的