scheduleJob

首先看AndroidManifest文件


 <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateHidden" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <service
            android:name=".service.TestJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"/>
    </application>


这个application中只包含一个Activity 和 一个service。
在Activity的onCreate函数中通过Intent 启动一个service,需要注意的是通过putExtra 携带一个Message对象给service




    @Override
    public void onCreate(Bundle savedInstanceState) {
         // Start service and provide it a way to communicate with us.
        Intent startServiceIntent = new Intent(this, TestJobService.class);
        startServiceIntent.putExtra("messenger", new Messenger(mHandler));
        startService(startServiceIntent);
    }


在service的onStartCommand函数中行,接收Intent发送过来的message,并想Activity 发送一个MSG_SERVICE_OBJ message
.
  public int onStartCommand(Intent intent, int flags, int startId) {
        Messenger callback = intent.getParcelableExtra("messenger");
        Message m = Message.obtain();
        m.what = MainActivity.MSG_SERVICE_OBJ;
        m.obj = this;
        try {
            callback.send(m);
        } catch (RemoteException e) {
            Log.e(TAG, "Error passing service object back to activity.");
        }
        return START_NOT_STICKY;
    }


activity 中的handleMessage 如下:
    Handler mHandler = new Handler(/* default looper */) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SERVICE_OBJ:
                    mTestService = (TestJobService) msg.obj;
                    mTestService.setUiCallback(MainActivity.this);
            }
        }
    };


又call service的的setUIcallback函数,主要是在service这边保存这个Activity


    public void setUiCallback(MainActivity activity) {
        mActivity = activity;
    }




初始化就结束了,主要是在Activity中启动一个service,service这边保存Activity的实例.


在layout文件中,定义一个button,当用户按这个button后其回调函数是scheduleJob
        <Button
            android:id="@+id/schedule_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:onClick="scheduleJob"
            android:text="@string/schedule_job_button_text"/>




我们看看scheduleJob的实现
    public void scheduleJob(View v) {
       JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent);
        mTestService.scheduleJob(builder.build());
    }
主要是新建一个jobinfo,并调用service的shedulejob开始运行这个job
    /** Send job to the JobScheduler. */
    public void scheduleJob(JobInfo t) {
        Log.d(TAG, "Scheduling job");
        JobScheduler tm =
                (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        tm.schedule(t);
    }
通过得到JobScheduler ,然后通过其schedule 函数调用onStartJob开始运行这个job。




    @Override
    public boolean onStartJob(JobParameters params) {
        // We don't do any real 'work' in this sample app. All we'll
        // do is track which jobs have landed on our service, and
        // update the UI accordingly.
        jobParamsMap.add(params);
        if (mActivity != null) {
            mActivity.onReceivedStartJob(params);
        }
        Log.i(TAG, "on start job: " + params.getJobId());
        return true;
    }


service的实现很简单,就是调用Activity的onReceivedStartJob
    public void onReceivedStartJob(JobParameters params) {
        mShowStartView.setBackgroundColor(startJobColor);
        Message m = Message.obtain(mHandler, MSG_UNCOLOUR_START);
        mHandler.sendMessageDelayed(m, 1000L); // uncolour in 1 second.
        mParamsTextView.setText("Executing: " + params.getJobId() + " " + params.getExtras());
    }
 Handler mHandler = new Handler(/* default looper */) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_UNCOLOUR_START:
                    mShowStartView.setBackgroundColor(defaultColor);
                    break;
       };
其实就是改变的背景颜色mShowStartView


其实可以在onStartJob 做任何事情,这边只是演示一下.




        <Button
            android:id="@+id/cancel_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:onClick="cancelAllJobs"
            android:text="@string/cancel_all_jobs_button_text"/>
如果按这个取消按键的话


    public void cancelAllJobs(View v) {
        JobScheduler tm =
                (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        tm.cancelAll();
    }
直接调用JobScheduler 的cancelAll方法取消所有的jobs


        <Button
            android:id="@+id/finished_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:layout_marginBottom="5dp"
            android:onClick="finishJob"
            android:text="@string/finish_job_button_text"/>


还有一个finishJob的按键,
    public void finishJob(View v) {
        if (!ensureTestService()) {
            return;
        }
        mTestService.callJobFinished();
        mParamsTextView.setText("");
    }


调用service的callJobFinished方法


    public boolean callJobFinished() {
        JobParameters params = jobParamsMap.poll();
        if (params == null) {
            return false;
        } else {
            jobFinished(params, false);
            return true;
        }
    }
主要是调用jobFinished方法,所以用户一般要override onStopJob方法


    @Override
    public boolean onStopJob(JobParameters params) {
        // Stop tracking these job parameters, as we've 'finished' executing.
        jobParamsMap.remove(params);
        if (mActivity != null) {
            mActivity.onReceivedStopJob();
        }
        Log.i(TAG, "on stop job: " + params.getJobId());
        return true;
    }


调用Activity的onReceivedStopJob(),设成另外一种颜色.


要是用jobshedule的话,一般要实现jobService的子类,jobService 有下面三个方法
final void jobFinished(JobParameters params, boolean needsReschedule)
abstract boolean onStartJob(JobParameters params)
abstract boolean onStopJob(JobParameters params)




实现jobService的子类后,新建一个Jobinfo,然后直接调用JobScheduler的schedule方法就行了,剩下的Android framework会搞定.这样做的好处就是onStartjob函数中做的事情会被放到backgroud中进行.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值