2015-03-25 66 views
0

我剛開始使用android開發,我試圖編寫一個在後臺運行的服務,並在特定時間啓動應用程序。創建在特定時間啓動應用程序的後臺服務。

我寫的程序是基於我遇到的教程,基本上應用程序有2個按鈕,一個開始和停止。一旦用戶按下開始按鈕,它將啓動後臺服務並檢查時間,如果時間合適,它將啓動應用程序。

但是我注意到它並不總是檢查時間,只有當用戶按下按鈕時纔會這樣做。我如何做到這一點,一旦用戶按下按鈕,它會不斷檢查時間?

這是我的代碼。 MyService.java

public class MyService extends Service{ 

    private static final String TAG = "MyService"; 

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

    @Override 
    public void onCreate() { 

     //Toast.makeText(this, "Congrats! MyService Created", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onCreate"); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     startApp("com.example.myApp"); 
     Log.d(TAG, "onStart"); 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 
    } 

    public void startApp(String packageName){ 
     Calendar c = Calendar.getInstance(); 
     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
     String strDate = sdf.format(c.getTime()); 
     if(strDate == "09:00" || strDate == "15:00" || strDate == "21:00"){ 
      Toast.makeText(this,strDate,Toast.LENGTH_LONG).show(); 
      Toast.makeText(this,"Starting the App",Toast.LENGTH_LONG).show(); 
      Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 
      if(intent != null){ 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
      } 
     } 
    } 
} 

MainActivity.Java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    //start the service 
    public void onClickStartServie(View V) 
    { 
     //start the service from here 
     startService(new Intent(this, MyService.class)); 
    } 
    //Stop the started service 
    public void onClickStopService(View V) 
    { 
     //Stop the running service from here 
     //Service will only stop if it is already running. 
     stopService(new Intent(this, MyService.class)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

} 
+0

檢查:HTTPS ://developer.android.com/training/scheduling/alarms.html – dit 2015-03-25 13:01:58

+0

因此,如果我在上午9點發出警報,然後每隔6小時發出一次警報,並將其放入StartApp功能,它會無限期地在後臺運行? – cyberbemon 2015-03-25 13:12:40

回答

1

我認爲使用告警管理將是一個更好的選擇。設定鬧鐘爲時間和接收機當時接收廣播如下面的代碼:清單中

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, AppConstants.ALARM_ID_TESTING, new Intent(
      AppConstants.FILTER_TESTING), PendingIntent.FLAG_UPDATE_CURRENT); 

    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisAfterCurrent, pendingIntent); 

添加接收器:

<receiver 
android:name=「TestReceiver" 
<intent-filter> 
    <action android:name="filter.test.time」 /> 
</intent-filter> 

和接收器類爲:

class TestReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals(AppConstants.FILTER_TESTING)) 
     { 
      // code here 
     } 
    } 
} 
+0

對不起,我是這個整個android dev的新手,我會在哪裏放置報警管理器初始化位?這是否在'MyService.java'中? – cyberbemon 2015-03-25 13:21:52

+0

不,不需要使用該服務,將它放在你想啓動計時器的地方。 – 2015-03-26 05:44:06

0

爲什麼不嘗試時間更改接收器而不是服務,因爲使用後臺服務器冰是不好的編程許可。服務在後臺繼續運行,並佔用大量的系統內存和負擔電池。此外,系統可以隨時停止任何額外的服務,以調整內存問題。

時間變化接收器是最好的方法,您可以比較時間並相應地打開任何應用程序。

0

我建議你這兩種方法:

  1. 使用 「新」 ScheduledThreadPoolExecutor作爲替代Timer

例子:

int threadCount      = 1; 
ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(threadCount); 
long initialDelay = 5; 
long period   = 10; 

ScheduledFuture<?> task = service.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     // DO IT EVERY 10 SECONDS 
    } 

}, initialDelay, period, TimeUnit.SECONDS); 

[...] 

//if you want you can cancel the task later 
task.cancel(true); // mayInterruptIfRunning = true 

因爲這些活動,線程和進程可以在任何時候都可以通過Android操作系統終止,但不能保證作業始終執行。

  • 因此,最好使用AlarmManager
  • 相關問題