2015-07-12 78 views
2

我想在后台自动和间隔时间数据, 我用这个,但不行不正确在后台运行的应用程序,并检查新数据

工作的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互联网连接或应用运行除了在运行时间的间隔自动!?

+0

你什么错误? logcat中有什么? –

+0

没有错误,但NewsServiceReceiver.java没有运行,我使用这个日志但从不显示'Log.i(DBAdapter.TAG,“[******* -----------> BACKGROUND < ----------- *******]“);' – sadegh

+1

请将您的代码与此答案进行比较。 http://stackoverflow.com/questions/30489474/android-notification-app-not-working-properly/30490629#30490629 –

回答

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 - >可以先活动时,应用程序运行

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>