创建在特定时间启动应用程序的后台服务。

时间:2015-03-25 12:59:50

标签: java android

我刚开始进行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;
    }

}

3 个答案:

答案 0 :(得分: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
       }
    }
 }

答案 1 :(得分:0)

为什么不尝试使用Time Changed Receiver而不是服务,因为使用后台服务是糟糕的编程方法。服务在后台继续运行并占用大量系统内存和负载电池。此外,系统可以随时停止运行任何额外服务以调整内存问题。

时间变化接收器是最好的方法,您可以相应地比较时间和打开任何应用程序。

答案 2 :(得分:0)

我建议你这两种方式:

  1. 使用“新”ScheduledThreadPoolExecutor替代Timer
  2. 示例:

    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 OS可以随时终止活动,线程和进程,因此无法保证作业始终执行。

    1. 因此,最好使用AlarmManager