zoukankan      html  css  js  c++  java
  • android中service启动后台程序

    ServiceAndroid中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the background ),Service并不与用户产生UI交互。其他的应用组件可以启动Service,即便用户切换了其他应用,启动的Service仍可在后台运行。一个组件可以与Service绑定并与之交互,甚至是跨进程通信(IPC)。例如,一个Service可以在后台执行网络请求、播放音乐、执行文件读写操作或者与 content provider交互 等。

    ps:附上一个service组件介绍的网站:https://blog.csdn.net/scott2017/article/details/51505801

    下面是一个音乐后台播放的例子:

    1.Activity类

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;

    /**
    * Created by cj on 2018/3/28.
    */

    public class ServiceDemo extends Activity implements View.OnClickListener{

    private static final String TAG = "ServiceDemo";
    Button buttonStart, buttonStop;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.servicedemo);

    buttonStart = (Button) findViewById(R.id.buttonStart);
    buttonStop = (Button) findViewById(R.id.buttonStop);

    buttonStart.setOnClickListener(this);
    buttonStop.setOnClickListener(this);
    }

    public void onClick(View src) {
    switch (src.getId()) {
    case R.id.buttonStart:
    Log.i(TAG, "onClick: starting service");
    startService(new Intent(this, MyService.class));
    break;
    case R.id.buttonStop:
    Log.i(TAG, "onClick: stopping service");
    stopService(new Intent(this, MyService.class));
    break;
    }
    }

    }
    2.Service子类:
    import android.app.Notification;
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.Build;
    import android.os.Debug;
    import android.os.IBinder;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import android.widget.Toast;

    /**
    * Created by cj on 2018/3/28.
    */

    public class MyService extends Service {

    private static final String TAG = "MyService";
    private final static int GRAY_SERVICE_ID = 1001;
    MediaPlayer player;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    return null;
    }

    @Override
    public void onCreate() {
    Toast.makeText(this,"MyService Created",Toast.LENGTH_SHORT).show();
    Log.i(TAG,"oncreated");
    player = MediaPlayer.create(this,R.raw.huanghun); //此处的R.raw.huanghun为要播放的音乐资源。在res文件夹下创建raw目录,huanghun.mp3为音乐资源,放到创建好的raw文件夹下
    player.setLooping(false);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    //sdk小于18时启动一个状态栏通知
    if(Build.VERSION.SDK_INT<18){
    startForeground(GRAY_SERVICE_ID,new Notification());
    }else{
    //sdk大于18 时启动一个状态栏通知
    Intent intent1 = new Intent(this,GrayInnerService.class);
    startService(intent1);
    startForeground(GRAY_SERVICE_ID,new Notification());
    }
    return super.onStartCommand(intent, flags, startId);
    }

    //给API >= 18 的平台上做灰色保护手段
    public class GrayInnerService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
    return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    startForeground(GRAY_SERVICE_ID, new Notification());
    stopForeground(true);
    stopSelf();

    return super.onStartCommand(intent, flags, startId);
    }
    }

    @Override
    public void onDestroy() {
    Toast.makeText(this, "My Service Stoped", Toast.LENGTH_LONG).show();
    Log.i(TAG, "onDestroy");
    player.stop();
    }

    @Override
    public void onStart(Intent intent, int startId) {
    Toast.makeText(this, "My Service Start", Toast.LENGTH_LONG).show();
    Log.i(TAG, "onStart");
    player.start();
    }
    }
    3.布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center">
    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="@string/servicesdemo" android:gravity="center" android:textSize="20sp" android:padding="20dp"/>
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/buttonStart" android:text="@string/start"></Button>
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/stop" android:id="@+id/buttonStop"></Button>
    </LinearLayout>
    4.String.xml文件
    <resources>
    <string name="app_name">update</string> //此处为运用程序的名称,一般项目创建时自带
    <string name="start">播放</string>
    <string name="stop">停止</string>
    <string name="servicesdemo">Service Demo</string>
    </resources>
    5.manifest.xml文件中配置
    
    
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".ServiceDemo">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    <service android:enabled="true" android:name=".MyService"/> //此处配置,name为service的子类。
    </application>



  • 相关阅读:
    kubernetes概述与入门
    kubernetes入门到放弃-docker基础篇
    Git远程仓库☞GitLab的使用
    Git远程仓库☞GitHub的使用
    Git版本控制系统
    持续集成-DevOps概念篇
    持续集成扫盲篇
    Centos7系统介绍
    LNMP架构说明
    dynamic_cast c++
  • 原文地址:https://www.cnblogs.com/xiangxinhouse/p/8664828.html
Copyright © 2011-2022 走看看