Android (安卓)中的 异步服务 未执行或被调用,且未报错

Android (安卓)中的AsyncService(异步服务)未执行或被调用,且未报错

在异步服务的实践中,主要写了一个Activity类IntentServiceActivity和一个Service类 AsyncService,但是在IntentServiceActivity 写了一行代码如下:

         Intent intent = new Intent(IntentServiceActivity.this,AsyncService.class);
         startService(intent);//注意这里是startService 不是startActivity

现象

想要去执行AsyncService 中主线程的代码和子线程的代码,但是程序运行后,上面的startService(intent);也成功执行,就是没有执行AsyncService里面对应的方法,也不报错。

猜测

这里小编想了想既然用到了Intent 来调用 AsyncService.class 那么会不会像Activity一样需要在AndroidManifest.xml中注册一下?

结果

果然在自己查找相应的文件看了看,的确需要在AndroidManifest.xml 注册一下,这里不是注册< activity >而是注册一个 < service > ,service 标签和 activity 属于同级标签,具体代码如下:

<!--   注册一个异步服务IntentServiceActivity-->
<activity android:name=".这里写你自己的调用异步服务Activity类"/>
<!--   注册一个服务AsyncService  设置 true 能够使用 -->
<service android:name=".这里写你自己的异步服务类名" android:enabled="true"/>

更详尽的代码如下

(仅供参考)
IntentServiceActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.yuanda.myfirstapp.util.DateUtil;

/**
 * 描述  异步服务的activity IntentServiceActivity,用户在点击后,能够操作页面,不会像“异步任务”一样操作不了页面
 */
public class IntentServiceActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_async_service;
    private Handler mHandler = new Handler();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sync_task);
        tv_async_service = (TextView) findViewById(R.id.tv_async_service);
        findViewById(R.id.btn_intent).setOnClickListener(this);
        mHandler.postDelayed(mService,100);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btn_intent){
            tv_async_service.setText(DateUtil.getNowTime()+" 您轻轻点了一下下(异步服务正在运行,不影响您在界面操作)");
        }
    }
    private Runnable mService = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(IntentServiceActivity.this,AsyncService.class);
            startService(intent);//注意这里是startService 不是startActivity
        }
    };
}

AsyncService.java

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

import androidx.annotation.Nullable;
/**
 * 描述   异步服务  AsyncService
 */
public   class AsyncService extends IntentService {
    private static final String TAG = "AsyncService";
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * super 里面的 name  ,Used to name the worker thread, important only for debugging.
     *  分配内部线程的唯一名称
     */
    public AsyncService() {

        super("com.yuanda.myfirstapp.AsyncService");
    }
    //onStartCommand运行于主线程
    @Override
    public int onStartCommand(Intent intent,int flags,int starid){
        //试试在onStartCommand 里面沉睡,页面按钮是不是无法点击了?
        Log.i(TAG, "onStartCommand");
        System.out.println("这里是运行主线程的内容···");
        return super.onStartCommand(intent,flags,starid);//调用父类方法的onStartCommand ,因为父类方法要向分线程传递消息
    }
    //onHandleIntent 运行分线程
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(TAG, "begin onHandleIntent");
        //在onHandleIntent这里执行耗时任务,不会影响页面的处理
        try {
            for(int i=0;i<10;i++){
                Thread.sleep(1000);
                System.out.println("1s 后再次输出");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "end onHandleIntent");
    }
}

activity_sync_task.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- 这里测试的是 异步服务  -->
    <Button
        android:id="@+id/btn_intent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点我看看有没有反应"
        android:textSize="18dp"/>
    <TextView
        android:id="@+id/tv_async_service"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值