第十五单元总结

后台操作及IntentService

1:IntentService

定义:IntentService是继承自Service实现了异步功能的类。

2:IntentService-应用

第一步:新建一个MyService继承自Service

public class MyIntentService extends IntentService {

HttpURLConnection connection;

InputStream inputStream;

public MyIntentService(){

super("anyway");

}

public MyIntentService(String name) {

super(name);

}

@Override

protected void onHandleIntent(@Nullable Intent intent) {

try {

URL url = new URL("http://c.m.163.com/nc/article/headline/T1348647853363/0-40.html");

connection = (HttpURLConnection) url.openConnection();

inputStream = connection.getInputStream();

byte[] bytes = new byte[1024];

int len = 0;

StringBuffer stringBuffer = new StringBuffer();

while ((len = inputStream.read(bytes)) != -1){

stringBuffer.append(new String(bytes,0,len)); }

Intent intent1 = new Intent("com.intentreceiver");

intent1.putExtra("json",stringBuffer.toString());

sendBroadcast(intent1);

} catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}

第二步:开启服务

public class IntentServiceActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_intent_service);

}

public void download(View view) {

//开启服务

Intent intent = new Intent(this,MyIntentService.class);

startService(intent);

}

}

第三步:注册服务

<service android:name=".MyIntentService"/>

3:Service-前台服务

后台服务在系统内存不足时有被回收的可能,为了保活服务我们可以选择将服务写为前台服务

1.创建Service重写方法

public class MyServices extends Service {

private static final String TAG = "amy";

@Override

public void onCreate() {

super.onCreate();

Log.d(TAG,"onCreate");

}

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

Intent intent1 = new Intent(this,MainActivity.class);

PendingIntent intent2 = PendingIntent.getActivity(this,0,intent1,0);

Notification notification = new Notification.Builder(this)

.setSmallIcon(R.mipmap.bq1)

.setContentTitle("前台服务")

.setContentText("播放器用的是前台服务")

.setContentIntent(intent2)

.build();

startForeground(110,notification);

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

2.启动服务

public class ServicesActivity extends AppCompatActivity {

Intent intent;

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_services);

//参数一:上下文 参数二:自定义服务类.class

intent = new Intent(this,MyServices.class); }

public void startFroatServer(View view) {

startService(intent);

}

public void stopFroatServer(View view) {

stopService(intent); }

}

4:Notification+IntentService

1.Service-核心代码

public class DownLoadMusicService extends IntentService {

public InputStream inputStream;

public int total;

public NotificationManager manager;

public int notificaton_id = 100;

public NotificationCompat.Builder builder;

public Handler handler = new Handler();

public int currentProgress = 0;

HttpURLConnection connection;

public DownLoadMusicService() {

super("LoadMusic");

}

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

public int onStartCommand(@Nullable Intent intent, int flags, int startId) {

initNotification();

startForeground(notificaton_id, builder.build());

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

}

@Override

protected void onHandleIntent( @Nullable Intent intent) {

String path = intent.getStringExtra("url");

try {

URL url = new URL(path);

connection = (HttpURLConnection) url.openConnection();

connection.setRequestProperty("Accept-Encoding", "identity");//不加此行得不到总长度

total = connection.getContentLength();//拿不到

if(connection.getResponseCode() == 200){

handler.post(nThread);

inputStream = connection.getInputStream();

int len = 0;

byte[] bytes = new byte[60];

File file0 = Environment.getExternalStorageDirectory();

File newFile = new File(file0,"dabeizhou.mp3");

FileOutputStream fileOutputStream = new FileOutputStream(newFile);

while ((len = inputStream.read(bytes)) != -1){

currentProgress+=len;

fileOutputStream.write(bytes,0,len);

}

Log.d("amy",currentProgress+"--");

}

}

@RequiresApi(api = Build.VERSION_CODES.O)

public void initNotification(){

manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

NotificationChannel channel = new NotificationChannel("channel_1","name",NotificationManager.IMPORTANCE_LOW);

manager.createNotificationChannel(channel);

builder = new NotificationCompat.Builder(this,"channel_1")

.setSmallIcon(R.mipmap.bq1)

.setContentText("下载文件")

.setContentText("下载中。。");

}

/**

* 线程用来发送通知

*/

Thread nThread = new Thread(){

@Override

public void run() {

super.run();

builder.setProgress(total,currentProgress,false);

manager.notify(notificaton_id,builder.build());

handler.postDelayed(nThread,1000);

}

};

@Override

public void onDestroy() {

super.onDestroy();

handler.removeCallbacks(nThread);

}

}

2.Activity-核心代码

public void downloadMusic(View view) {

//下载

Intent intent = new Intent(this,DownLoadMusicService.class);

intent.putExtra("url","http://m10.music.126.net/20200704095418/39a88357cd32cb186ccaed3699cd2083/ymusic/8481/cbba/7868/c96fe64c4a34c2137ce30e5f941b145c.mp3");

startService(intent);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值