在后台运行应用程序并检查新数据

时间:2015-07-12 17:58:30

标签: java android autorun

我想在后台和自动获取数据,并且在时间间隔内, 我使用这个,但不工作不能正常工作

的AndroidManifest.xml

.
.
.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
.
.
.
<service
    android:name=".NewsServiceReceiver"
    android:icon="@drawable/ic_launcher"
    android:label="@string/service_name" >
</service>

<receiver
    android:name=".NewsReceiver"
    android:enabled="true"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

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

NewsReceiver.java

public class NewsReceiver extends BroadcastReceiver {

    private static final long REPEAT_TIME = 1000 * 30;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        AlarmManager service = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
            Intent i = new Intent(context, NewsStartReceiver.class);
            PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
            Calendar cal = Calendar.getInstance();
            // start 30 seconds after boot completed
            cal.add(Calendar.SECOND, 30);

            service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                cal.getTimeInMillis(), REPEAT_TIME, pending);

    }

}

NewsStartReceiver.java

public class NewsStartReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Intent service = new Intent(context, NewsServiceReceiver.class);
        context.startService(service);

    }

}

NewsServiceReceiver.java

public class NewsServiceReceiver extends Service {

.
.
.


    @Override
    public IBinder onBind(Intent arg0) {

        return null;
    }

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

        Log.i(DBAdapter.TAG, "[*******-----------> BACKGROUND  <-----------*******]");
        //My Code Here
        return Service.START_NOT_STICKY;
     }
}

我希望在互联网连接或应用运行时在后台运行NewsServiceReceiver.java以及在时间间隔内自动运行!?

1 个答案:

答案 0 :(得分:1)

我的问题解决了

<强> Autostart.java

public class Autostart extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Intent alarm = new Intent(context, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarm, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        System.out.println("[*******-----------> Autostart  <-----------*******]");

        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pendingIntent);

    }

}

<强> AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent background = new Intent(context, NewsServiceReceiver.class);
        context.startService(background);
    }

}

<强> NewsServiceReceiver.java

public class NewsServiceReceiver extends Service {

    private boolean isRunning;
    private Context  contex;
    private Thread backgroundTread;

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

    @Override
    public void onCreate(){
        this.contex = this;
        this.isRunning = false;
        this.backgroundTread = new Thread(myTask);

    }

    private Runnable myTask = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("[*******-----------> BACKGROUND  <-----------*******]");

            //------------My Code Here--------------

            stopSelf();
        }
    };


    @Override
    public void onDestroy(){
        this.isRunning = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(!this.isRunning){
            this.isRunning = true;
            this.backgroundTread.start();
        }
        return START_STICKY;
    }

}

SplashActivity.java - &gt;应用程序运行时可能是第一个活动

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
-
        this.context=this;
        Intent alarm = new Intent(this.context, AlarmReceiver.class);
        boolean alarmRunning = (PendingIntent.getBroadcast(this.context, 0, alarm, PendingIntent.FLAG_NO_CREATE) != null);
        if(alarmRunning == false){
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pendingIntent);
        }
}

<强>的AndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<service
    android:name=".NewsServiceReceiver"
    android:enabled="true" >
</service>

<receiver
    android:name=".Autostart"
    android:enabled="true"
    android:exported="true"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />

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