我如何永远保持Android应用程序中的一个线程?

时间:2015-10-30 18:19:53

标签: java android multithreading service root

我正在构建一个企业应用程序,需要获取有关员工根电话的一些信息以进行企业管理。 这个线程需要每五分钟运行一次。 当android启动时,我正在使用由广播(BOOT_COMPLETED)启动的Activity,它启动一个无限的线程将此信息发送到服务器。 我目前的问题是我的应用程序被用户打开很多其他应用程序后被android杀死。 保持线程在后台运行以将此信息发送到服务器的更好方法是什么?

主要应用类

public static void startService(Context mContext){

    try{
        //Schedule Service.
        scheduleService(mContext);

        //Call onUpdate.
        onUpdate();

    }catch (Exception o){
        Utilities.log(o.toString());
    }

}



public static void scheduleService(Context mContext){

    try{

        final int NOTIFICATION_INTERVAL = 5 * 60 * 1000;
        Intent mIntent = new Intent(mContext, ServiceReceiver.class);
        AlarmManager mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        PendingIntent mPendingIntent = PendingIntent.getBroadcast(mContext, 1, mIntent, 0);

        mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), NOTIFICATION_INTERVAL, mPendingIntent);

    }catch (Exception o){
        Utilities.log(o.toString());
    }
}

ServiceReceiver

public class ServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context mContext, Intent intent) {

    Utilities.log("Service Received");

    //Start Service.
    MyApplication.startService(mContext);

 }
}

AndroidManifest

<receiver
 android:name=".BootUpReceiver"
 android:enabled="true">
 <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    <action android:name="android.intent.action.REBOOT"/>

    <category android:name="android.intent.category.DEFAULT"/>
 </intent-filter>
</receiver>


<receiver android:name=".ServiceReceiver"/>    

BootUpReceiver

public class BootUpReceiver extends BroadcastReceiver
{ 

     public void onReceive(Context mContext, Intent mIntent){

         Utilities.log("BootUp Received.");

        //Start Service.
        MyApplication.startService(mContext);
     }
}

2 个答案:

答案 0 :(得分:3)

  

为重复警报创建静态广播接收器并从广播启动意图服务不使用无限线程

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        NotificationStatus.setupNotification(context); // if you restart your phone
    }

}

class NotificationStatus{
    //Call only one time from app from any activity
    public static void setupNotification(Context context) {
        final int NOTIFICATION_INTERVAL = 5 * 60 * 1000;
        Intent myIntent1 = new Intent(context, NotificationReceiver.class);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 1, myIntent1, 0);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), NOTIFICATION_INTERVAL, pendingIntent1);

    }
}


public class NotificationReceiver extends BroadcastReceiver {
    private static final int mNotificationId = 0;
    @Override
    public void onReceive(Context context, Intent intent) {
        //start your services here for sending data
Intent intent1 = new Intent(context, SyncService.class);
    context.startService(intent1);
    }
}



public class SyncService extends IntentService {

public SyncService(String name) {
    super(name);
}

@Override
protected void onHandleIntent(Intent intent) {
    //Write code here for sending data to server
}

}

  

AndroidManifest

<receiver android:name="NotificationReceiver" />
<receiver android:name="BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
  

在清单中定义服务

<service android:name=".SyncService"/>

答案 1 :(得分:0)

您需要将您的应用程序设为Android服务。