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>