首页 > 其他分享 >Android四大组件——Service——和Activity的通信

Android四大组件——Service——和Activity的通信

时间:2022-08-19 21:11:44浏览次数:67  
标签:Service void MyService intent Activity Intent Android public

任务描述:在MyService里提供一个下载功能,然后再Activity中可以决定何时开始下载,以及随时查看下载进度。

按照之前的思路:在MyService中创建一个方法,用以对下载进行管理。然后在MainActivity中调用该方法。

1.修改布局如下:

 

 添加了一个控制下载的按钮。

2.在MyService中添加管理下载的方法

    public void startDownload(){
        Toast.makeText(this,"开始下载",Toast.LENGTH_LONG).show();
    }

3.在MainActivity中调用该方法

    public void startDownload(View view) {
        MyService myService = new MyService();
        myService.startDownload();
    }

现在运行看看效果:

 

 毫不意外的,崩掉了。

原因是空指针异常。

Toast.makeText(this,"开始下载",Toast.LENGTH_LONG).show();

this这里的上下文空指针异常。

不能通过该形式实现,换一个思路,借助前一篇中我们忽略的onBind()方法便可。如下:

实现思路:在MyService里创建一个专门的Binder对象来对下载进行管理。(通过绑定的形式来启动服务)

修改MyService的代码,修改后如下:

public class MyService extends Service {

    private static final String TAG = "MyService";
//新建DownloadBinder类,并让它继承Binder,任何在其内部提供开始下载的方法。 public class DownloadBinder extends Binder{ public void startDownload(){ Log.d("MyService","开始下载"); Toast.makeText(getApplicationContext(),"开始下载",Toast.LENGTH_LONG).show(); } } @Override public IBinder onBind(Intent intent) { return new DownloadBinder(); //将返回值修改为创建一个DownloadBinder的对象 } @Override public void onCreate() { super.onCreate(); Log.d(TAG,"onCreate"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"onStartCommand"); return super.onStartCommand(intent, flags, startId); } }

修改MainActivity的代码,修改后如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    public MyService.DownloadBinder downloadBinder;

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

    //开启服务
    public void startService(View view) {
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        startService(intent);
    }

    //结束服务
    public void stopService(View view) {
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        stopService(intent);
    }

    private ServiceConnection serviceConnection = new ServiceConnection() { //创建一个ServiceConnection的内部类,并重写里面的方法。
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) { //该方法会在Activity和Service绑定成功的时候调用。
            Log.d(TAG,"onServiceConnected");
            downloadBinder =(MyService.DownloadBinder) service; //通过向下转型得到了DownloadBinder的实列
            downloadBinder.startDownload();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) { //该方法只有在Service的创建崩溃或者被杀掉的时候才会调用,并不常用。

        }
    };
    //开始下载
    public void startDownload(View view) {
        Intent intent = new Intent();   
        intent.setClass(this,MyService.class); 
        bindService(intent,serviceConnection, BIND_AUTO_CREATE);//绑定服务
    //第一个参数是Intent对象,第二个参数是前面创建出来的ServiceConnection实例,
//第三个参数是一个标志位,这里的BIND_AUTO_CREATE表示在Activity和Service绑定后自动创建Service.
} }

现在来运行一下:

 

 可以看到,以及运行成功了。

 

任何一个Service在整个应用程序范围内都是通用的。即MyService不仅可以和MainActivty绑定,还可以和任何一个其他的Activity进行绑定,并且在绑定完成后,它们都可以获取相同的DownloadBinder实例。

标签:Service,void,MyService,intent,Activity,Intent,Android,public
From: https://www.cnblogs.com/Xiang-MY/p/16603224.html

相关文章

  • 文献解读--HemI 2.0 an online service for heatmap illustration
    文献解读--HemI2.0:anonlineserviceforheatmapillustrationIntroduction这是一个可以做各种距离热图的软件,有Web端,也有Windows应用.之前出过1.0版本,现在升级成......
  • Android自定义Dialog
    开发时我们可能需要一些非全屏view的一些提示信息,或者不想去创建需要在清单文件注册的Activity来显示view,那么我们就需要借助一些其他的窗体子类来完成需求如:Dialog,PopuW......
  • 直播商城源码,Android RecycleView 加载网络图片
    直播商城源码,AndroidRecycleView加载网络图片1.布局 <android.support.v7.widget.RecyclerView  android:id="@+id/recyclerView"  android:layout_width="m......
  • 解决 Android真机调试 卸载后无法再次安装成功
    1、配置环境变量androidsdk中的tools目录和platform-tools目录都配置到系统环境变量path中; 2、运行cmd输入命令adbdevices查看当前连接设备的机器编号;......
  • Android生成密钥散列
    接入facebook登录和分享时需要在facebook后台添加密钥散列,下面是生成方式第一种(简单,准确)记住要用相应的签名文件进行签名哦try{PackageInfoinf......
  • Android接入firebase
    android的出海应用借用firebase来进行数据统计分析和应用的崩溃报告,下面是firebase的接入步骤:google提供了两种接入方式,我们讲第二种通过androidstudio的菜单AndroidSt......
  • android找不到R类
    importorg.cocos2d.demo.R;org.cocos2d.demo包名(creatorhelloworld自带)  NotificationManagerCompatnotificationManager=NotificationManagerCompat.from(th......
  • Android 加载库的方式
    Android加载库的方式有多种(1)本地library(2)jar包,仅有class文件和清单文件,仅能调用不含资源的方法(3)arr包,包裹class文件、清单文件,以及resource资源文件,可以调用arr包中样式......
  • k8s中ingress,service,depoyment,pod如何关联
    k8s中ingress,service,depoyment,pod通过label标签名称来识别关联,它们的label name一定是一样的。1、查询发布的deploymet控制器[root@k8s-master1~]#kubectlgetdeplo......
  • Android EditText的onEditorAction监听事件防止执行两次
    Android的EditText通过setOnEditorActionListener给文本编辑框设置监听事件,但是在其处理方法onEditorAction中的逻辑在每次回车后都触发了两次,这是因为在键盘回车的ACTION_......