精华内容
下载资源
问答
  • Java线程学习经典例子-读写者演示

    千次阅读 2016-02-14 00:24:07
    线程-生产者线程 package com.gloomyfish.jse.thirdteen; public class ProductThread extends Thread { private ObjectData data; public ProductThread(ObjectData data) { this.data = data; } @...

    Java线程学习经典例子-读写者演示

    Java线程学习最经典的例子-读写者,主要用到Thread相关知识如下:

    -         线程的start与run

    -         线程的休眠(sleep)

    -         数据对象加锁(synchronized)

    -         数据对象的等待与释放(wait and notify)

    程序实现:

    -ObjectData数据类对象,通过synchronized关键字实现加锁,在线程读写者中使用。

    -ConsumerThread消费者线程,读取数据对象中count值之后,通知生产者线程

    -ProductThread生产者线程,对数据对象中count值操作,每次加1,然后通知消费者线程

    类结构图如下:


    代码实现

    消费者-读线程

    package com.gloomyfish.jse.thirdteen;
    
    public class ConsumerThread extends Thread {
    	private ObjectData data;
    	public ConsumerThread(ObjectData data) {
    		this.data = data;
    	}
    
    	@Override
    	public void run() {
    		while(true) {
    			try {
    				synchronized (data) {
    					data.wait();
    					data.read();
    					data.notify();
    				}
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    
    写线程-生产者线程

    package com.gloomyfish.jse.thirdteen;
    
    public class ProductThread extends Thread {
    	private ObjectData data;
    
    	public ProductThread(ObjectData data) {
    		this.data = data;
    	}
    
    	@Override
    	public void run() {
    		while (true) {
    			try {
    				synchronized (data) {
    					data.write();
    					Thread.sleep(3000);
    					data.notify();
    					data.wait();
    				}
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    
    数据对象类

    package com.gloomyfish.jse.thirdteen;
    
    public class ObjectData {
    
    	private int count;
    	
    	public ObjectData() {
    		count = 0;
    	}
    	
    	public void read() {
    		System.out.println("read count : " + count);
    		System.out.println();
    	}
    	
    	public void write() {
    		count++;
    		System.out.println("write count : " + count);
    	}
    }
    
    测试代码:

    	public static void main(String[] args) {
    		ObjectData data = new ObjectData();
    		ConsumerThread ct = new ConsumerThread(data);
    		ProductThread pt = new ProductThread(data);
    
    		ct.start();
    		pt.start();
    }
    总结:

    示例程序代码完成了线程之间如何通过wait与notify实现数据的读写

    同步控制。演示了Java的同步关键字synchronized的用法与线程的用法。






    展开全文
  • 通知(Notification)是 Android 系统中比较有特色的一个功能,当某个应用程序希望向 用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一 条通知后,手机最上方的状态栏中会显示一...

    通知(Notification)是 Android 系统中比较有特色的一个功能,当某个应用程序希望向
    用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一
    条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详
    细内容。
    使用:当程序进入到后台的时候我们才需要使用通知,所以在广播接收器和服务中使用通知较多。


    下面的代码是在通知中加上了震动、提示音和LED等效果。


    MainActivity中代码:

    package com.demo.notificationdemo;
    
    import java.io.File;
    
    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.graphics.Color;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity implements OnClickListener {
    
    	private Button start_notification;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		start_notification = (Button) findViewById(R.id.start_notification);
    		start_notification.setOnClickListener(this);
    	}
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		switch (v.getId()) {
    		case R.id.start_notification:
    			/**
    			 * 创建通知管理类NotificationManager的实例,用来管理通知
    			 */
    			NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
    			/**
    			 * 创建通知类Notification实例(用来存储通知所需的信息); 一共三个参数:
    			 * 1)、指定通知使用的图标,如:R.drawable.ic_launcher ;
    			 * 2)、指定通知的ticker内容,通知被创建的时候,在状态栏一闪而过,属于瞬时提示信息。
    			 * 3)、指定通知被创建的时间,以毫秒为单位,下拉状态栏时,这个时间会显示在相应的通知上。
    			 */
    			Notification notification = new Notification(
    					R.drawable.ic_launcher, "有通知来了", System.currentTimeMillis());
    
    			/**
    			 * 手机设置的默认提示音
    			 */
    			Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    			/**
    			 * sound属性是一个 Uri 对象。 可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来.
    			 * 如:手机的/system/media/audio/ringtones 目录下有一个 Basic_tone.ogg音频文件,
    			 * 可以写成: Uri soundUri = Uri.fromFile(new
    			 * File("/system/media/audio/ringtones/Basic_tone.ogg"));
    			 * notification.sound = soundUri; 我这里为了省事,就去了手机默认设置的铃声
    			 */
    			 notification.sound = uri;
    
    			/**
    			 * vibrate属性是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。
    			 * 参数中下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长, 下标为2的值又表示手机静止的时长,以此类推。
    			 */
    			 long[] vibrates = { 0, 1000, 1000, 1000 };
    			 notification.vibrate = vibrates;
    
    			/**
    			 * 手机处于锁屏状态时, LED灯就会不停地闪烁, 提醒用户去查看手机,下面是绿色的灯光一 闪一闪的效果
    			 */
    			notification.ledARGB = Color.GREEN;// 控制 LED 灯的颜色,一般有红绿蓝三种颜色可选
    			notification.ledOnMS = 1000;// 指定 LED 灯亮起的时长,以毫秒为单位
    			notification.ledOffMS = 1000;// 指定 LED 灯暗去的时长,也是以毫秒为单位
    			notification.flags = Notification.FLAG_SHOW_LIGHTS;// 指定通知的一些行为,其中就包括显示
    																// LED 灯这一选项
    
    			/**
    			 * 如果不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动
    			 */
    			// notification.defaults = Notification.DEFAULT_ALL;
    
    			/**
    			 * 实例化Intent,构建意图:从当前页面条状到NotificationActivity页面
    			 */
    			Intent intent = new Intent(this, NotificationActivity.class);
    
    			/**
    			 * 用于启动活动、启动服务以及发送广播等。 根据需求来选择是使用
    			 * getActivity()方法、getBroadcast()方法、还是 getService() 方法。 一共四个参数:
    			 * 1)、第一个参数是 上下文Context ; 2)、 第二个参数一般用不到,通常都是传入 0 即可 3)、第三个参数是一个
    			 * Intent对象,我们可以通过这个对象构建出 PendingIntent 的“意图”; 4)、第四个参数用于确定
    			 * PendingIntent 的行为
    			 */
    			PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
    					intent, PendingIntent.FLAG_CANCEL_CURRENT);
    
    			/**
    			 * 设定通知标准的布局。四个参数: 1)、上下文对象Context; 2)、指定通知的标题内容,下拉系统状态栏可看到;
    			 * 3)、指定通知的正文,下拉系统状态栏可看到; 4)、用于启动活动、启动服务以及发送广播
    			 */
    			notification.setLatestEventInfo(this, "股票大涨", "今日万科的股票停牌,应对恶意收购",
    					pendingIntent);
    
    			/**
    			 * 启动通知. 两个参数: 1)、id,保证每个通知的id唯一; 2)、Notification对象
    			 */
    			manager.notify(1, notification);
    			break;
    
    		default:
    			break;
    		}
    	}
    
    }
    

    下载地址:


    Android中通知的提示音、震动和LED灯效果小例子下载地址




    展开全文
  • Android通知栏微技巧,8.0系统中通知栏的适配

    万次阅读 多人点赞 2018-04-17 07:39:11
    大家好,今天我们继续来学习Android 8.0系统的适配。...在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配

    转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/79854070

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    大家好,今天我们继续来学习Android 8.0系统的适配。

    之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏。在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配

    那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配。

    其实在8.0系统之前,还有一次通知栏变动比较大的版本,就是5.0系统。关于5.0系统需要对通知栏进行适配的内容,我也整理了一篇文章,感兴趣的朋友可以去阅读 Android通知栏微技巧,那些你所没关注过的小细节

    那么下面我们就开始进入本篇文章的正题。


    为什么要进行通知栏适配?

    不得不说,通知栏真是一个让人又爱又恨的东西。

    通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是Android系统原创的,反而苹果在iOS 5之后也加入了类似的通知栏功能。

    通知栏的设计确实非常巧妙,它默认情况下不占用任何空间,只有当用户需要的时候用手指在状态栏上向下滑动,通知栏的内容才会显示出来,这在智能手机发展的初期极大地解决了手机屏幕过小,内容展示区域不足的问题。

    可是随着智能手机发展的逐渐成熟,通知栏却变得越来越不讨人喜欢了。各个App都希望能抢占通知栏的空间,来尽可能地宣传和推广自己的产品。现在经常是早上一觉醒来拿起手机一看,通知栏上全是各种APP的推送,不胜其烦。

    我个人虽然是Android应用开发者,但同时也是Android手机的资深用户。我已经使用了8年的Android手机,目前我对于通知栏的这种垃圾推送是零容忍的。现在每当我安装一个新的App时,我都会先到设置里面去找一找有没有推送开关,如果有的话我会第一时间把它关掉。而如果一个App经常给我推送垃圾信息却又无法关闭时,我会直接将它的通知总开关给关掉,如果还不是什么重要的App的话,那么我可能就直接将它卸载掉了。

    为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?很大一部分原因都是因为开发者没有节制地使用导致的。就好像App保活一样,直到今天还是不断有人问我该如何保活App,试想如何每个人都能保活自己的App,那么最终受害的人是谁?还不是使用Android手机的用户。大家的手机只会越来越卡,最后只想把手机丢掉,变成iPhone用户了。也是因为开发者没节制地使用,Android现在的每个版本都会不断收缩后台权限。

    回到通知栏上也是一样,每个开发者都只想着尽可能地去宣传自己的App,最后用户的手机就乱得跟鸡窝一样了。但是通知栏又还是有用处的,比如我们收到微信、短信等消息的时候,确实需要通知栏给我们提醒。因此分析下来,通知栏目前最大的问题就是,无法让用户对感兴趣和不感兴趣的消息进行区分。就比如说,我希望淘宝向我推送卖家发货和物流的相关消息,但是我不想收到那些打折促销或者是让我去买衣服的这类消息。那么就目前来说,是没有办法对这些消息做区分的,我要么同意接受所有消息,要么就屏蔽所有消息,这是当前通知栏的痛点。

    那么在Android 8.0系统中,Google也是从这个痛点开始下手的。

    8.0系统的通知栏适配

    从Android 8.0系统开始,Google引入了通知渠道这个概念。

    什么是通知渠道呢?顾名思义,就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。

    拥有了这些控制权之后,用户就再也不用害怕那些垃圾推送消息的打扰了,因为用户可以自主地选择自己关心哪些通知、不关心哪些通知。举个具体的例子,我希望可以即时收到支付宝的收款信息,因为我不想错过任何一笔收益,但是我又不想收到支付宝给我推荐的周围美食,因为我没钱只吃得起公司食堂。这种情况,支付宝就可以创建两种通知渠道,一个收支,一个推荐,而我作为用户对推荐类的通知不感兴趣,那么我就可以直接将推荐通知渠道关闭,这样既不影响我关心的通知,又不会让那些我不关心的通知来打扰我了。

    对于每个App来说,通知渠道的划分是非常需要仔细考究的,因为通知渠道一旦创建之后就不能再修改了,因此开发者需要仔细分析自己的App一共有哪些类型的通知,然后再去创建相应的通知渠道。这里我们来参考一下Twitter的通知渠道划分:

    可以看到,Twitter就是根据自己的通知类型,对通知渠道进行了非常详细的划分,这样用户的自主选择性就比较高了,也就大大降低了用户不堪其垃圾通知的骚扰而将App卸载的概率。


    我一定要适配吗?

    Google这次对于8.0系统通知渠道的推广态度还是比较强硬的。

    首先,如果你升级了appcompat库,那么所有使用appcompat库来构建通知的地方全部都会进行废弃方法提示,如下所示:

    上图告诉我们,此方法已废弃,需要使用带有通知渠道的方法才行。

    当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。

    好了,前面向大家介绍了这么多的背景知识,那么现在开始我们就正式进入正题,来学习一下如何进行8.0系统中通知栏的适配。

    创建通知渠道

    首先我们使用Android Studio来新建一个项目,就叫它NotificationTest吧。

    创建好项目之后,打开app/build.gradle文件检查一下,确保targetSdkVersion已经指定到了26或者更高,如下所示:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        defaultConfig {
            applicationId "com.example.notificationtest"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }

    可以看到,这里我在创建新项目的时候默认targetSdkVersion就是26,如果你是低于26的话,说明你的Android SDK有些老了,最好还是更新一下。当然如果你懒得更新也没关系,手动把它改成26就可以了。

    接下来修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                String channelId = "chat";
                String channelName = "聊天消息";
                int importance = NotificationManager.IMPORTANCE_HIGH;
                createNotificationChannel(channelId, channelName, importance);
    
                channelId = "subscribe";
                channelName = "订阅消息";
                importance = NotificationManager.IMPORTANCE_DEFAULT;
                createNotificationChannel(channelId, channelName, importance);
            }
        }
    
    
        @TargetApi(Build.VERSION_CODES.O)
        private void createNotificationChannel(String channelId, String channelName, int importance) {
            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }
    }

    代码不长,我来简单解释下。这里我们在MainActivity中创建了两个通知渠道,首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高,因为低版本的手机系统并没有通知渠道这个功能,不做系统版本检查的话会在低版本手机上造成崩溃。

    创建一个通知渠道的方式非常简单,这里我封装了一个createNotificationChannel()方法,里面的逻辑相信大家都看得懂。需要注意的是,创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数,其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为,当然这里只是初始状态下的重要等级,用户可以随时手动更改某个渠道的重要等级,App是无法干预的。

    上述代码我是模拟了这样一个场景。想象一下我们正在开发一个类似于微信的App,其中App通知主要可以分为两类,一类是我和别人的聊天消息,这类消息非常重要,因此重要等级我设为了IMPORTANCE_HIGH。另一类是公众号的订阅消息,这类消息不是那么重要,因此重要等级我设为了IMPORTANCE_DEFAULT。除此之外,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。

    现在就可以运行一下代码了,运行成功之后我们关闭App,进入到设置 -> 应用 -> 通知当中,查看NotificationTest这个App的通知界面,如下图所示:

    刚才我们创建的两个通知渠道这里已经显示出来了。可以看到,由于这两个通知渠道的重要等级不同,通知的行为也是不同的,聊天消息可以发出提示音并在屏幕上弹出通知,而订阅消息只能发出提示音。

    当然,用户还可以点击进去对该通知渠道进行任意的修改,比如降低聊天消息的重要等级,甚至是可以完全关闭该渠道的通知。

    至于创建通知渠道的这部分代码,你可以写在MainActivity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。


    让通知显示出来

    触发通知的代码和之前版本基本是没有任何区别的,只是在构建通知对象的时候,需要多传入一个通知渠道ID,表示这条通知是属于哪个渠道的。

    那么下面我们就来让通知显示出来。

    首先修改activity_main.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:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送聊天消息"
            android:onClick="sendChatMsg"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送订阅消息"
            android:onClick="sendSubscribeMsg"
            />
    </LinearLayout>

    这里我们在布局文件中加入了两个按钮,很显然,一个是用于触发聊天消息渠道通知的,一个是用于触发订阅消息渠道通知的。

    接下来修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        public void sendChatMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "chat")
                    .setContentTitle("收到一条聊天消息")
                    .setContentText("今天中午吃什么?")
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.drawable.icon)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
                    .setAutoCancel(true)
                    .build();
            manager.notify(1, notification);
        }
    
        public void sendSubscribeMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "subscribe")
                    .setContentTitle("收到一条订阅消息")
                    .setContentText("地铁沿线30万商铺抢购中!")
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.drawable.icon)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
                    .setAutoCancel(true)
                    .build();
            manager.notify(2, notification);
        }
    }

    这里我们分别在sendChatMsg()和sendSubscribeMsg()方法中触发了两条通知,创建通知的代码就不再多做解释了,和传统创建通知的方法没什么两样,只是在NotificationCompat.Builder中需要多传入一个通知渠道ID,那么这里我们分别传入了chat和subscribe这两个刚刚创建的渠道ID。

    现在重新运行一下代码,并点击发送聊天消息按钮,效果如下图所示:

    由于这是一条重要等级高的通知,因此会使用这种屏幕弹窗的方式来通知用户有消息到来。然后我们可以下拉展开通知栏,这里也能查看到通知的详细信息:

    用户可以通过快速向左或者向右滑动来关闭这条通知。

    接下来点击发送订阅消息按钮,你会发现现在屏幕上不会弹出一条通知提醒了,只会在状态栏上显示一个小小的通知图标:

    因为订阅消息通知的重要等级是默认级别,这就是默认级别通知的展示形式。当然我们还是可以下拉展开通知栏,查看通知的详细信息:

    不过上面演示的都是通知栏的传统功能,接下来我们看一看Android 8.0系统中通知栏特有的功能。

    刚才提到了,快速向左或者向右滑动可以关闭一条通知,但如果你缓慢地向左或者向右滑动,就会看到这样两个按钮:

    其中,左边那个时钟图标的按钮可以让通知延迟显示。比方说这是一条比较重要的通知,但是我暂时没时间看,也不想让它一直显示在状态栏里打扰我,我就可以让它延迟一段后时间再显示,这样我就暂时能够先将精力放在专注的事情上,等过会有时间了这条通知会再次显示出来,我不会错过任何信息。如下所示:

    而右边那个设置图标的按钮就可以用来对通知渠道进行屏蔽和配置了,用户对每一个App的每一个通知渠道都有绝对的控制权,可以根据自身的喜好来进行配置和修改。如下所示:

    比如说我觉得订阅消息老是向我推荐广告,实在是太烦了,我就可以将订阅消息的通知渠道关闭掉。这样我以后就不会再收到这个通知渠道下的任何消息,而聊天消息却不会受到影响,这就是8.0系统通知渠道最大的特色。

    另外,点击上图中的所有类别就可以进入到当前应用程序通知的完整设置界面。


    管理通知渠道

    在前面的内容中我们已经了解到,通知渠道一旦创建之后就不能再通过代码修改了。既然不能修改的话那还怎么管理呢?为此,Android赋予了开发者读取通知渠道配置的权限,如果我们的某个功能是必须按照指定要求来配置通知渠道才能使用的,那么就可以提示用户去手动更改通知渠道配置。

    只讲概念总是不容易理解,我们还是通过具体的例子来学习一下。想一想我们开发的是一个类似于微信的App,聊天消息是至关重要的,如果用户不小心将聊天消息的通知渠道给关闭了,那岂不是所有重要的信息全部都丢了?为此我们一定要保证用户打开了聊天消息的通知渠道才行。

    修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        public void sendChatMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = manager.getNotificationChannel("chat");
                if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
                    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
                    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
                    intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
                    startActivity(intent);
                    Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();
                }
            }
    
            Notification notification = new NotificationCompat.Builder(this, "chat")
                    ...
                    .build();
            manager.notify(1, notification);
        }
    
        ...
    
    }

    这里我们对sendChatMsg()方法进行了修改,通过getNotificationChannel()方法获取到了NotificationChannel对象,然后就可以读取该通知渠道下的所有配置了。这里我们判断如果通知渠道的importance等于IMPORTANCE_NONE,就说明用户将该渠道的通知给关闭了,这时会跳转到通知的设置界面提醒用户手动打开。

    现在重新运行一下程序,效果如下图所示:

    可以看到,当我们将聊天消息的通知渠道关闭后,下次再次发送聊天消息将会直接跳转到通知设置界面,提醒用户手动将通知打开。

    除了以上管理通知渠道的方式之外,Android 8.0还赋予了我们删除通知渠道的功能,只需使用如下代码即可删除:

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.deleteNotificationChannel(channelId);

    但是这个功能非常不建议大家使用。因为Google为了防止应用程序随意地创建垃圾通知渠道,会在通知设置界面显示所有被删除的通知渠道数量,如下图所示:

    这样是非常不美观的,所以对于开发者来说最好的做法就是仔细规划好通知渠道,而不要轻易地使用删除功能。


    显示未读角标

    前面我们提到过,苹果是从iOS 5开始才引入了通知栏功能,那么在iOS 5之前,iPhone都是怎么进行消息通知的呢?使用的就是未读角标功能,效果如下所示:

    实际上Android系统之前是从未提供过这种类似于iOS的角标功能的,但是由于很多国产手机厂商都喜欢跟风iOS,因此各种国产手机ROM都纷纷推出了自己的角标功能。

    可是国产手机厂商虽然可以订制ROM,但是却没有制定API的能力,因此长期以来都没有一个标准的API来实现角标功能,很多都是要通过向系统发送广播来实现的,而各个手机厂商的广播标准又不一致,经常导致代码变得极其混杂。

    值得高兴的是,从8.0系统开始,Google制定了Android系统上的角标规范,也提供了标准的API,长期让开发者头疼的这个问题现在终于可以得到解决了。

    那么下面我们就来学习一下如何在Android系统上实现未读角标的效果。

    修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ...
    
        @TargetApi(Build.VERSION_CODES.O)
        private void createNotificationChannel(String channelId, String channelName, int importance) {
            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            channel.setShowBadge(true);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }
    
        public void sendSubscribeMsg(View view) {
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this, "subscribe")
                    ...
                    .setNumber(2)
                    .build();
            manager.notify(2, notification);
        }
    }

    可以看到,这里我们主要修改了两个地方。第一是在创建通知渠道的时候,调用了NotificationChannel的setShowBadge(true)方法,表示允许这个渠道下的通知显示角标。第二是在创建通知的时候,调用了setNumber()方法,并传入未读消息的数量。

    现在重新运行一下程序,并点击发送订阅消息按钮,然后在Launcher中找到NotificationTest这个应用程序,如下图所示:

    可以看到,在图标的右上角有个绿色的角标,说明我们编写的角标功能已经生效了。

    需要注意的是,即使我们不调用setShowBadge(true)方法,Android系统默认也是会显示角标的,但是如果你想禁用角标功能,那么记得一定要调用setShowBadge(false)方法。

    但是未读数量怎么没有显示出来呢?这个功能还需要我们对着图标进行长按才行,效果如下图所示:

    这样就能看到通知的未读数量是2了。

    可能有些朋友习惯了iOS上的那种未读角标,觉得Android上这种还要长按的方式很麻烦。这个没有办法,因为这毕竟是Android原生系统,Google没有办法像国内手机厂商那样可以肆无忌惮地模仿iOS,要不然可能会吃官司的。但是我相信国内手机厂商肯定会将这部分功能进行定制,风格应该会类似于iOS。不过这都不重要,对于我们开发者来说,最好的福音就是有了统一的API标准,不管国内手机厂商以后怎么定制ROM,都会按照这个API的标准来定制,我们只需要使用这个API来进行编程就可以了。

    好的,关于Android 8.0系统适配的上下两篇文章到这里就结束了,感谢大家阅读。

    文章中的示例源码点击 这里 下载。

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

    20160507110203928         20161011100137978

    展开全文
  • 20万行代码完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于...


    作者:小傅哥
    博客:https://bugstack.cn

    沉淀、分享、成长,让自己和他人都能有所收获!😄

    一、前言

    20万行代码写完,毕业了找一份工作不是问题!

    刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于培训还需要花家里一笔不小的费用,也有同班同学已经找到一份不错的工作开始赚钱的比对。

    大学四年其实有足够的时间让你学会编程,也能从一个较长时间的学习中,知道自己适合不适合做程序员。就像我的同学里虽然都是计算机或者软件工程专业,但毕业后并没有都从事软件开发工作,或者从事了一段时间发现并不适合这个行业而选择到其他领域发展。

    所以如果你是真的喜欢编程,那么在这个行业里工作你会很开心,如果不是那么往后路还长,你所要面对的晋升加薪跳槽都可能成为一道道障碍。目前可能你还是新人不了解自己是否喜欢编程开发,那么可以在以后的学习中体会,自己是否愿意为一个运行结果调来调去,辗转不寐的研究分析,只为最后那一个运行通过而激动!

    当你可以在激动和开心中写完20万行代码,对于毕业后的求职找工作来说几乎可以叫你一声面霸,也可能你在实习时就被公司直接留下,这是个人才组织需要你!

    20万行代码看上去很多,但放在4年的大学学习中并不会有多难。平均每天200行,一个月是6000行,一年算10个月是6万行,三年就有18万行。这20万行代码会把你从一个编程小白,带入到熟练使用Java相关API,也能给你带入到初级工程师的水平。

    初学编程你可能想把一句代码完整敲下来都不容易,就更不用说运行出结果了。因此此时你的大脑和手还并不能迅速理解你眼睛里看到的这一行行代码都是啥,要干啥。这就像新买回来的钢琴手指头上去摸肯定是生硬的,敲出的声音也不连贯。这个阶段只能是照着例子大量的写,度过一个熟练期才能更好的学习。

    为了可以让更多的小伙伴理解这件事,我会从我的在校培训外包跳槽阶段成长以及找什么样的工作分享给大家作为参考,最后再把我整理出资料一并分享给大家。

    二、经历

    12年10月25日,在CSDN发的一个帖子 拿到两个offer,一个7k,一个转正税后4.5k。求意见! 距离现在它已经过去好久了,当时也是因为拿到了两份offer的选择纠结,所以发了个帖子求问。好气的是当时竟然不知道去面试面试互联网公司,信息太闭塞了,而且培训的地方并没有说过互联网一些公司的信息。

    讲一讲我这7k的经历;

    1. 12年07月,校企合作来北京昌平一个小县城的地方参加中软培训
    2. 12年10月,培训接近尾声,开始找工作,月薪7k的中软就是最后的选择的地方,放弃了在北航院内的国家科技
    3. 12年12月,虽然拿到中软Offer但迟迟不让入职,电话联系了很多次我说可以先去实习,但都说等通知。没办法,在北京也不可能就硬待着,回家的话也麻烦行李、住宿都得折腾,所以又面了一家中科软进去实习了三个月,赚点钱养活自己
    4. 13年03月,中软的通知终于来了,但竟然是参加岗前培训,又被培训了一次,当时特别讨厌培训,每次都是讲Java基础,差点生气怼老师
    5. 13年09月,在中软正式转正,也就是说培训完又是实习,7月份毕业后9月份才入职为正式员工,心里有点不爽,埋下了一个后续跳槽的种子。哪有实习这么久的!
    6. 15年04月,第一次有跳槽准备,毕竟写了两年的C#写够了,面试了第一家互联网公司,乐视致新,不过后来没去,被公司留了下来
    7. 15年08月,之前谈的留下来涨薪,但最后少涨了1千块钱。所以继续面试,还算顺利面了两家,最后在8月25日跳槽进互联网完成。

    以上整个过程就是我从学校实习找工作以及最后跳槽的一个阶段性经历,也有过在这条路上跌跌撞撞。就像;

    • 虽然我面到了中软管培生,但错失没选择要北京户口,而是要了400块房补
    • 在中软9月份从实习转正式员工,错过了第二年的入职满一年才涨薪的条件(但我觉得这个有点故意坑了)
    • 明明是学了那么多Java,但却写了两年C#,大家还是要选择自己喜欢的语言进行工作,否则会很麻烦
    • 提了离职,基本就不要想着再留下来,无论什么条件。哪怕钱和职位满足了,心里也有隔阂以及个人对没经历过事情的一个期许
    • 从传统外包跳槽的互联网,并不那么容易,技术使用的不同、开发场景的不同、组织关系的不同,一切都可能是从一个较低的位置重新开始。你需要自身技术不错,也需要一个好人带
    • 但当时在的传统也有不错的点,比如可以5:30下班,带我的经理人很不错,公司也不那么累,有时候还可以出差溜达溜达。

    三、学习

    一个大学生会经历在校、实习、就业几个阶段,其中在校学习属于蓄力阶段,要学习很多知识才能支撑起来将来的实习和平稳就业。

    蓄力阶段的学习,主要是对编程技术的基础的夯实,以及多学习与数学相关的内容,比如;数据结构、算法逻辑,这些知识对将来在技术上的提升和造诣都是非常好的基石。下面就是整个大学过程中在编程学习过程中需要经历的阶段,如图;

    • 熟悉工具:初学编程后你大概会接触到一系列的研发工具,包括IDEA、Eclipse、Navicat、Maven、Git、Tortoise、SourceTree、Visio、Xmind等等,工具的熟练会让编程更流畅。
    • 编写代码:此时你需要大量写代码,写很多的代码,因为你几乎就是需要靠写代码把整个所学的编程语言熟练使用起来。总不能手生到写完 public,写不出来 class,这跟我不会弹钢琴一样,敲完了1,后面不知道要在哪找下一个音符♪了。
    • 功能开发:小的功能开发是综合锻炼技术使用的阶段,比如做一个计算器、求一个水仙数、从一篇html中摘取你要的信息等等。此段经历会解决你之前感觉学完技术没出用的痛苦,现在你可以想象出各种场景问题,之后用代码去处理。还可以帮助英语系的小师妹,把她需要背的单词从网站中爬取下来,汇总出各类热词、语句、摘要等
    • 项目开发:小功能练手后,接下来你就可以做做项目了。比如你常听到的图书管理系统、教师教学管理系统等等。如果觉得没有意思,你可以从哪里获取项目呢?从你用到的各类APP中,把这里用的功能简化,之后做一些项目开发。比如一个简单的商城、抽奖、全物流单号查询。另外你还可以在github中查找一些项目,去参考学习并自己动手实践。
    • 数据结构:可能初学编程并不会对数据结构有多少思考,也想象不到这类内容是用在哪的。但其实这类技术内容早已被你天天使用,例如:LinkedList、ArrayList、HashMap,这里就包括了数组链表队列散列表等各项数据结构,当你将来要开发一些较大型的互联网应用程序时,你所有的逻辑设计都会考虑到数据要如何存放,数据结构如何设计才能更合理的被程序使用。
    • 算法逻辑:学完数据结构接下来要做的就是对算法逻辑的学习,这里不仅仅是简单的刷题,而是在数据结构的上使用算法将数据更合理的存放和读取以及做相应的操作。就像你能逐步了解的;排序、二分、旋转、洗牌等等,以及将来还会在阅读JDK源码中会看到,扰动函数、负载因子、拉链寻址、开放寻址、哈希散列、除法散列法、平方散列法、斐波那契(Fibonacci)散列法等等。
    • 设计模式:当你开发了很多很多程序代码以后,你会逐步的思考怎么才能让这些代码有可复用性呢,怎么写才能让更多人读懂呢、怎么实现才能让再接需求时能更快的承接呢。这些都会随着你开始实习真正接触到公司级的代码开始逐步的感受到的,写代码不是一锤子买卖,也不是炫耀技术,当你有更宽的视野范围时,就会思考的更多。这里推荐阅读《重学Java设计模式》 这是一本基于互联网真实案例编写的Java设计模式实践图书。全书以解决方案为核心,从实际开发业务中抽离出交易、营销、规则引擎、中间件、框架源码等22个真实场景,对设计模式进行全面、彻底的分析。帮助读者灵活地使用各种设计模式,从容应对复杂变化的业务需求,编写出易维护、可扩展的代码结构。

    以我个人经历和经验来看,想搞定这些学习范围和内容,最大的动力是来自于对编程的热爱和折腾。就像我这样做过很多土项目,如下;

    • 串口通信、在线考试、考试抽题、彩礼管理、成绩管理、即时聊天、计算器还有后来折腾过的仿微信聊天,这些项目都可以不断的夯实个人的技术能力,每一次做新的一个项目都会把之前所遇到的问题,又考虑新的实现方式再折腾一遍。
    • 编程的学习中重要的并不是结果,而是在这个过程中经历了什么。哪怕是犯了很多的错也没关系,因为每一次犯错都是学习的机会,都可以找到更多的资料,每一个资料里又可能教会你其他的知识。

    四、就业

    不只是我,可能很多在上学阶段并不知道都是做Java开发,就业的企业也分为传统行业、国企、半国企、外包、外企、互联网等这么多类型,尤其是我这样在13年毕业的时候,既没有所谓的就业指导,也没有有经验的朋友了解,就只能跟着大家走。好在现在大家可以在互联网中获取到这些信息,也就能早早的帮助毕业同学进行择业。

    1. 传统行业

    • 难度:⭐⭐
    • 公司:金蝶、用友
    • 发展:在传统行业方面有较强的技术积累和产品沉淀,一般其他公司也都有传统行业研发的产品。另外现在的传统行业逐步包括了互联网的领域开发以及技术使用,只不过会比纯互联网少一些高并发场景,因为大部分这类软件面对的并不是C端人群。所以个人进入此类公司会相对比较稳定,但如果后期想再跳槽比较麻烦,会出现技术断层。

    2. 国企&半国企

    • 难度:⭐⭐⭐
    • 公司:联想、京东方、中软国际、国家电网
    • 发展:早前应届生入职国企或者半国企一般会有解决北京户口,但现在可能名额不断的减少了。像中软有一部分自己做的东西,也有一部分是承接外包的内容。此类公司做的工作内容可能比较单一,有时候一个项目会用很多年,但同时可能不会太忙,有一些自己的时间,并且像联想、国家电网福利待遇也都不错。

    3. 外包

    • 难度:⭐⭐⭐
    • 公司:对日外包、企业外包
    • 发展:像是在大连会有一些专门的对日外包企业,还可能需要长期在日本出差。我的两个同学上学时候日语都学的不错,现在一直在日本工作,就他们来说挺习惯在外面的生活了。还有一部分外包是企业外包,比如你入职一个外包公司,可能会把你这个人外派给华为、腾讯、阿里等公司,开发他们外包出来的工作,此类工作一般相对来说短期、非核心。但干的好的也有转正机会,直接入职大厂,不过比较难。而且外包到企业里的人员,没有正式员工的待遇

    4. 外企

    • 难度:⭐⭐⭐⭐
    • 公司:亚马逊、谷歌、微软
    • 发展:外企工作还是挺香的,相对来说没有那么强的加班,福利待遇也比较不错。例如像这类的公司会明确写上不加班,以及各种假期和旅游。但可能是近几年被国内互联网挤压的,也有一些在国内的外企有裁员的动作。

    5. 互联网

    • 难度:⭐⭐⭐⭐⭐
    • 公司:百度、阿里、腾讯、字节、京东、美团、滴滴等等
    • 发展:这类公司在北上广就多了去了,虽然多但面试难度仍然不低,尤其是现在内卷的情况下,需要你会很多知识以及数据结构或者刷算法,才可能找到一份不错的工作。此类的公司的薪资待遇不错,每年都水涨船高,可能一个刚毕业的重点大学,大学生,入职的薪资就要倒挂各类老员工了。除了有少许的内卷,其他的还是挺不错的。

    6. 出国

    • 难度:⭐⭐⭐⭐⭐
    • 公司:加拿大的 shopee、美国的脸书、谷歌、苹果等等
    • 发展:如果喜欢国外的生活,又有出去的本事,那也是一个非常好的选择。像小傅哥熟悉的一个北大的伙伴,入职到了加拿大的 shopee,收入以及整个生活节奏对他来说还是非常满意的。

    以上就是各类公司的一个简单介绍,每一个人就业时都会有自己的选择,比如想安稳些、想要户口、想要高工资、想不那么加班等等,只要你能对自己的选择负责,合理规划好自己的职业发展,那么就可以了。

    五、资料

    1. 技术内容

    其实现在互联网的文档、资料、书籍、视频都已经很多了,但也可能正因为太多了,让初学编程的人找不到所处阶段,大一、大二、大三、大四以及毕业了工作了几年后,都应该找什么样的资料学习。

    所以我这里把各类资料进行整合,按照不同阶段的学习范围把资料分到不同的文件夹去,方便所处不同阶段的读者可以有一个相对准确的学习范围。

    2. 实战内容

    如果你已经跨过了初级阶段,需要做一些实践型的项目,可以关注下我的Github,如下:

    • 内容:本代码库是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。这部分资料也是我所写博客中实践项目的源码,在这里你可以学到Netty、字节码编程、设计模式、领域驱动设计、规则引擎、面试、架构以及职场经历的分享。
    • 地址https://github.com/fuzhengwei/CodeGuide/wiki

    六、总结

    • 如果一个大学生不怎么关注技术博客,也不知道有哪些技术博客,那么大概率你基本不会了解到你要学什么技术,也没有渠道可以让你拓展自己的知识面。并且尤其是在现在的软件基于人群喜好推荐下,你知道的越少的东西,就越少知道这个东西。所以主动有意识的学习,几乎是你个人成长最快的方式。
    • 做一件事,就把一件事做好!认认真真的长期坚持下来,你会在所走的路上收获很多,千万不要急于求成,否则你能获得的只是微乎其微。当你有一天真的要拿手里的这几张牌,出去闯荡的时候,会被人家炸哭。
    • 另外在大学里进来不要去做一些不会给自身带来长久价值的兼职工作,如果你真的缺那份钱另说,否则尽可能把这些时间用在你将来要找的工作所需的知识学习上。时间不多,做有价值的事更有益个人成长。
    • 酒香不怕巷子深,放在现在是几乎就是不可能的。因为酒不在是你一家酒了,谁能曝光的更多,宣传的更足,展示的更好,谁就更有机会可能成为佼佼者。否则站在台上那个不一定比你强的人,却可能比你过的更好。

    七、系列推荐

    展开全文
  • JAVA线程池例子

    万次阅读 2010-05-19 13:03:00
    用途及用法 网络请求通常有两种形式:第一种,请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者数据,最后断开,如文件下载,网络流媒体等。另一种形式是请求频繁,但是连接上以后读/很少量的数据...
  • 手把手教你专利申请书/如何申请专利

    万次阅读 多人点赞 2008-12-10 10:46:00
    手把手教你专利申请书·如何申请专利   摘要 小前言 (一)申请前的准备工作 ...(三)关于费用 (四)其他的话 参考资源 提示 常见问题的问与答   摘要:  如何好专利申请?由于很多专利申请人都...
  • 这两天做项目,在对移动端前端页面做页面高度自适应固定时遇到了...这篇博文:一是为了总结,二也是抛专引玉,如果有哪位朋友看了此博文,有更好的实现方式,还请多评论留言! 相互学习和进步!
  • 我入职阿里后,才知道原来简历这么

    万次阅读 多人点赞 2020-03-13 13:26:31
    私下里,有不少读者问我:“二哥,如何才能出一份专业的技术简历呢?我总感觉自己的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有过简历了,但我认识的一个同行,他在阿里,给我说了...
  • android service 例子

    千次阅读 2013-11-05 09:45:18
    过一些android程序,但是android中的Service的组件却不曾用过,因此,对它也不甚了解,所以,今天个小例子来学习如何使用Service。这其实也是我学习新东西的一个方法,对于陌生的东西,看书只是理论只是的了解,...
  • EPOLLOUT例子 EPOLLOUT触发条件

    千次阅读 2019-07-05 03:01:43
    群里小伙伴没搞懂EPOLLOUT 再2个例子; 2个例子都是回声服务器代码; 关于EPOLLET的基础 , 以及EPOLLIN|EPOLLOUT|EPOLLET 一起注册的例子:EPOLLET简单例子 下面2个例子都是关于EPOLLOUT, 第一个例子利用EPOLL_...
  • ZooKeeper分布式锁实现java例子,附完整可运行源代码

    万次阅读 多人点赞 2018-11-06 14:27:44
    关于分布式锁的代码到此就讲解完了,我们再看下客户端如何使用它。 我们创建一个TicketSeller类,作为客户端来使用分布式锁。  TicketSeller类 sell() 不带锁的业务逻辑方法,代码如下: private ...
  • linux下使用异步通知

    千次阅读 2015-05-23 22:47:36
    异步通知则是当设备可以访问时才主动通知应用程序,有点像设备的硬中断。   并不是所有的设备都支持异步通知,应用程序通常假设只有套接字和终端才有异步通知的能力。 异步通知存在一个问题,当进程收到SIGIO信号时...
  • Linux-C UDP简单例子

    万次阅读 多人点赞 2019-03-13 20:12:04
    Linux-C UDP简单例子 一、简述 记--使用UDP协议通信的简单例子。 说明: 网络中有很多主机,我们使用IP地址标识主机的身份。一台主机有多个应用程序,我们使用端口号来标识应用。 例子打包链接: ...
  • Spring AOP中的前置通知和后置通知详解

    万次阅读 多人点赞 2017-05-19 18:20:53
    而spring2.0之后,提供Annotation设置AOP的通知,更加简化了AOP的实现,还是用之前的例子,来对比看看spring2.0之后AOP的通知有多简便。   接口和实现类不变,前置通知类的实现: package org.spring....
  • 升职加薪的工作总结怎么

    千次阅读 2020-12-10 01:25:25
    2020年马上就要过去了,年底了!想要升职加薪,工作总结要什么内容呢?你为业务部门创造了什么价值,特别是...举了例子:例如中台部门,开发了一个线上服务的监控系统,用来监控各个系统的健康度,在软件系统碰...
  • 全网目前最全python例子(附源码)

    万次阅读 多人点赞 2019-12-30 14:55:05
    告别枯燥,60秒学会一个小例子,系统学习Python,从入门到大师。Python之路已有190个例子: 第零章:感受Python之美 第一章:Python基础 第二章:Python之坑 第三章:Python字符串和正则 第四章:Python文件 第五章...
  • 一个小例子彻底搞懂 MVP

    万次阅读 多人点赞 2018-06-28 13:17:11
    举个例子,假设有个 App 已经开发完成了,可以在手机上正常使用,现在要求做平板上的适配,在平板上的界面显示效果有所变化,TextView 并不是直接在 Activity 中的,而是在 Fragment 里面,如果没有使用 View 的接口...
  • 我比照着第一行代码了第八章的使用通知程序 我按照书上用了notification.setLatestEventInfo(),然后报错,网上查了一下说setLatestEventInfo是以前版本的用法,后来被抛弃了,于是我又用了新的用法,就是...
  • Android10.0通知Notification的使用这一篇就够了

    万次阅读 多人点赞 2020-04-24 14:19:45
    最近一段时间的都是android源码的文章,前几天在公司做了一个需求是关于前台服务的,在前台服务的时候深入使用到了通知,今天就先一篇文章总结一下通知的相关内容,后面有时间了在介绍一下前台服务的相关内容...
  • Java中的事件、监听器的简单例子

    万次阅读 2013-04-05 14:58:43
    事件监听器类则包含了事件被触发时的响应函数,业务逻辑在该响应函数中;而事件源则有一个事件监听器列表,当事件触发时,通知所有的监听者,采用的是观察者模式 (发布-订阅模式)。 1、事件类。一般继承自...
  • android接口回调详解、简单例子+复杂例子

    万次阅读 多人点赞 2016-08-30 17:27:12
    使用接口的核心原因:为了能够向上转型为多个基类型。...实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。 接口
  • 一个Android Service小例子

    千次阅读 2015-11-30 18:18:22
    过一些android程序,但是android中的Service的组件却不曾用过,因此,对它也不甚了解,所以,今天个小例子来学习如何使用Service。这其实也是我学习新东西的一个方法,对于陌生的东西,看书只是理论只是的了解,...
  • 利用多Redis实现分布式锁原理与实现分析

    万次阅读 热门讨论 2016-10-02 08:26:57
    在我这篇文章的时候,其实我还是挺纠结的,因为我这个方案本身也是雕虫小技拿出来显眼肯定会被贻笑大方,但是我最终还是拿出来与大家分享,我本着学习的态度和精神,希望大家能够给与我指导和改进方案。...
  • 玩家移动信息同步例子,我已经过了两个版本的啦,一个java的,一个是fms的,现在又了个red5的,其实这些的原理都是差不多的。以前好象没怎么讲解原理,这些就得详细点吧。用red5做服务器,其实客户端基本是fms...
  • Spring中的AOP以及切入点表达式和各种通知

    万次阅读 多人点赞 2019-05-31 17:57:50
    是必须知道和掌握的 切面类:就是要执行的增强的方法所在的类,比如咱们例子里的MyTransaction类 通知:切面类里的增强方法,比如咱们例子的beginTransaction( )方法和commit( ) 目标方法:要执行的目标方法,比如...
  • 文章目录J.U.C脑图ReentrantLock概述ReentrantLock 常用方法synchronized 和 ReentrantLock的比较ReentrantLock示例读写锁ReentrantReadWriteLock例子StempedLock示例Condition示例代码 J.U.C脑图 ReentrantLock...
  • Java并发编程系列之十八:读写锁

    千次阅读 2016-04-05 16:20:53
    而读写锁允许同一时刻有多个读线程进行访问,但是在有线程的时候,所有的读线程和其他所有的线程都将阻塞。读写锁维护了一对锁,一个读锁和一个锁,这种分离提高了并发性,因为在使用排他锁的时候,读读线程也...
  • 本节带来的是Android中用于在状态栏显示通知信息的控件:Notification,相信大部分 学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而 现在普遍的Android设备基本都在4.x以上,...
  • SpringAOP简单例子

    千次阅读 2018-07-27 16:51:10
    通过配置切点来触发所需要的功能,比如,我需要在请求进入方法的时候打印,即可使用aop当中的前置通知来做到,这样就不需要每个方法中都去一遍,配置好之后引用即可。 aop代码实例: 1.创建一个控制台程序;...
  • 手把手教你appium_ios第一个例子

    千次阅读 2014-04-16 10:59:09
    搭建好了mac上的appium以后,现在一个例子

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,602
精华内容 87,840
关键字:

关于写通知的例子