2016-10-13 19:58:49 georgeNi 阅读数 745
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19238 人正在学习 去看看 任苹蜻

最近做项目,为了让订单信息及时得到反馈,所以要求在锁屏状态收到推送消息时,唤起屏幕显示消息。经参考http://blog.csdn.net/maosidiaoxian/article/details/40587935完成该项功能。

首先,在应用界面发一条广播,模仿后台发出一条推送消息:

handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent=new Intent();
                intent.setAction("testScreenDown");
                sendBroadcast(intent);
            }
        },5*1000);

广播接受到消息处理(记得注册广播):

<span style="white-space:pre">	</span>//锁屏弹窗
        KeyguardManager km
                = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        //判断是否在锁屏状态
        if (km.inKeyguardRestrictedInputMode()) {
            Intent alarmIntent = new Intent(context, ScreenDownActivity.class);
            //从广播里跳转至activity,需要添加以下标志,不然会报错!
            alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(alarmIntent);
        }

这里用到一个KeyguardManager,锁屏与解锁的管理类,不过其有关解锁的内部类已经从api13开始废弃了:


可以看到,解锁与锁屏都可以用2个Flag代替,使用起来会更简单,待会用到。

继续,就要开始写锁屏时要弹出来的activity了,先注册:

 <!-- 锁屏弹窗界面-->
        <activity
            android:name=".activity.ScreenDownActivity"
            android:excludeFromRecents="true"
            android:launchMode="singleInstance"
            android:taskAffinity=""
            android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
            ></activity>

其中excludeFromRecents属性按照字母理解,就是让整个界面不出现在最近访问的历史中,主题设置很重要,该主题是让界面背景设置成当前手机的桌面背景,这样看起来就不会显得突兀了!

acitvity中代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_down);
        final Window win = getWindow();
        win.addFlags
                        //让该界面显示在锁屏屏幕之上(或者说短暂的隐取锁屏界面)
                (WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        //在未设置锁屏功能时自动解锁
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        //在该界面显示时,保持屏幕常亮
 //             | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        //唤醒屏幕
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        initViews();

    }

当中就用到之前提到的flag,另外提一下另一种方法唤醒(已过时,可以不用,了解一下):

 @Override
    protected void onNewIntent(Intent intent) {
//        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
//        if (!pm.isScreenOn()) {
//            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |
//                    PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
//            wl.acquire();
//            wl.release();
//        }
    }

最后附上效果图:


附加github地址:https://github.com/george-wind/ScreenDownWindow






2017-07-18 00:55:52 qq_30379689 阅读数 5948
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19238 人正在学习 去看看 任苹蜻

Dialog的自定义,仿淘宝、天猫、京东等商城广告弹窗


学习,学习,学以致用

Dialog已经是安卓开发者的家常便饭了,经常用来作为一些提醒功能,但是它也可以拓展为广告弹窗效果,让我们来自定义一个广告的Dialog吧。下面是今天要实现的效果图

这里写图片描述

一、自定义Dialog布局的实现

Dialog的布局很简单,其实就是一个充满容器的图片,view_dialog_advertisement.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/iv_advertisement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="12dp"
        android:src="@drawable/welcome_advertisement" />

</RelativeLayout>

在Dialog里面放置我们要显示的效果图即可

这里写图片描述

二、自定义Dialog代码的实现

public class MyAdvertisementView extends Dialog implements View.OnClickListener {

    public MyAdvertisementView(Context context) {
        super(context);
        setContentView(R.layout.view_dialog_advertisement);
        //设置点击布局外则Dialog消失
        setCanceledOnTouchOutside(true);
    }

    public void showDialog() {
        Window window = getWindow();
        //设置弹窗动画
        window.setWindowAnimations(R.style.style_dialog);
        //设置Dialog背景色
        window.setBackgroundDrawableResource(R.color.colorTransparent);
        WindowManager.LayoutParams wl = window.getAttributes();
        //设置弹窗位置
        wl.gravity = Gravity.CENTER;
        window.setAttributes(wl);
        show();
        findViewById(R.id.iv_advertisement).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        dismiss();
    }
}

上面代码所做的事情

  1. 初始化设置Dialog显示的布局
  2. 提供一个方法弹出Dialog
  3. 设置Dialog里面控件的点击事件

三、自定义Dialog的弹窗动画

在代码中通过window.setWindowAnimations()设置我们的弹窗动画,下面来style.xml的代码

<!-- dialog动画 -->
<style name="style_dialog">
    <item name="android:windowEnterAnimation">@anim/anim_popup_zoom_enter</item>
    <item name="android:windowExitAnimation">@anim/anim_popup_zoom_exit</item>
</style>

anim_popup_zoom_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:duration="500"
        android:fromXScale="0.8"
        android:fromYScale="0.8"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="500"
        android:fromAlpha="0"
        android:toAlpha="1.0" />
</set>

anim_popup_zoom_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:duration="300"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.8"
        android:toYScale="0.8" />

    <alpha
        android:duration="300"
        android:fromAlpha="1.0"
        android:toAlpha="0" />
</set>

四、使用自定义Dialog

在代码中只需要创建我们的Dialog对象,然后调用我们提供的弹窗方法即可

MyAdvertisementView myAdvertisementView = new MyAdvertisementView(this);
myAdvertisementView.showDialog();

部分源码下载

到这里的课程就结束,如果对基础控件感兴趣的朋友可以关注我博客的基础控件系列

2019-06-01 21:58:19 qinxuexiang_blog 阅读数 340
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19238 人正在学习 去看看 任苹蜻

实现弹窗效果

这一小节我将教大家使用activity 实现弹窗效果,只需要改activity的主题可实现弹窗效果

方式1 

效果图

在style.xml文件中加入如下代码

<style name="dialog_style" parent="@style/AppTheme">
    <!--是否悬浮在activity上-->
    <item name="android:windowIsFloating">true</item>
    <!--透明是否-->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:background">@null</item>
    <!--设置没有窗口标题、dialog标题等各种标题-->
    <item name="android:windowNoTitle">true</item>
    <item name="android:title">@null</item>
    <item name="android:dialogTitle">@null</item>
</style>

接着修改该activity的主题样式即可实现弹窗效果

<application
...
    <activity android:name=".DialogActivity" android:theme="@style/dialog_style"></activity>
...
</application>

方式2

效果图

在style.xml文件中加入如下代码

<!--dialog样式的界面-->
<style name="dialog_style2" parent="Theme.AppCompat.Light.Dialog">
    <!--是否悬浮在activity上-->
    <item name="android:windowIsFloating">true</item>
    <!--透明是否-->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:background">@null</item>
    <!--设置没有窗口标题、dialog标题等各种标题-->
    <item name="android:windowNoTitle">true</item>
    <item name="android:title">@null</item>
    <item name="windowNoTitle">true</item>
    <item name="android:dialogTitle">@null</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
</style>

接着修改该activity的主题样式即可实现弹窗效果

<application
...
    <activity android:name=".DialogActivity" android:theme="@style/dialog_style2"></activity>
...
</application>
2018-02-09 15:11:29 u014078990 阅读数 15617
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19238 人正在学习 去看看 任苹蜻

在上篇文档中,我主要记录了通过接口回调实现了DialogFragment与宿主Acitivity的通信,但是在实际开发过程中,登录界面往往是从“我的”这个Fragment打开的,这里发现接口回调不是很好用,查阅了很多文档,都没有很好的解决办法,因此,怎样把输入的账户名和密码由DialogFragment传递给宿主Fragment以便完成进一步的网络请求等操作就成了我们亟待解决的问题,这里我们通过setTartgetFragment()这个方法即可解决。

这里因为界面等基本与上篇与Activity交互的文档相同,所以不再详细赘述,可以参考如下文档。

http://blog.csdn.net/u014078990/article/details/79286850

首先看下实际效果。


实现步骤:

1.在DialogFragment这个方法里,在登录按钮的onClick点击事件里设置监听。

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login_btn:
                if (getTargetFragment()== null){
                    return;
                }
                Intent intent= new Intent();
                intent.putExtra(USERNAME, mUsername.getText().toString());
                intent.putExtra(USERPASSWORD, mPassword.getText().toString());
                getTargetFragment().onActivityResult(MainFragment.REQUEST_CODE, Activity.RESULT_OK, intent);
                break;
        }
    }

完整代码:

package com.fantasychong.dialogfragmentlogin2;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * Created by lenovo on 2018/2/8.
 */

public class LoginDailogFragment extends DialogFragment implements View.OnClickListener {

    public static final String USERNAME = "userName";
    public static final String USERPASSWORD = "userPassword";
    private EditText mUsername;
    private EditText mPassword;
    private Button btn;
    private ImageView iv;
    private TextView toReg;
    private ProgressBar pb;
    private LoginDailogFragment fragment;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //设置背景透明
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view= LayoutInflater.from(getActivity()).inflate(R.layout.dialog_login, null);
        iv= view.findViewById(R.id.login_iv);
        toReg= view.findViewById(R.id.login_register);
        mUsername= view.findViewById(R.id.login_et1);
        btn= view.findViewById(R.id.login_btn);
        mPassword= view.findViewById(R.id.login_et2);
        iv.setOnClickListener(this);
        toReg.setOnClickListener(this);
        btn.setOnClickListener(this);

        builder.setView(view);
        return builder.create();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login_btn:
                if (getTargetFragment()== null){
                    return;
                }
                Intent intent= new Intent();
                intent.putExtra(USERNAME, mUsername.getText().toString());
                intent.putExtra(USERPASSWORD, mPassword.getText().toString());
                getTargetFragment().onActivityResult(MainFragment.REQUEST_CODE, Activity.RESULT_OK, intent);
                break;
        }
    }
}

2.在宿主Fragment里设置onActivityResult方法设置回调的参数。

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode== REQUEST_CODE){
            String userName= data.getStringExtra(LoginDailogFragment.USERNAME);
            String userPassword= data.getStringExtra(LoginDailogFragment.USERPASSWORD);
            name.setText(userName);
            password.setText(userPassword);
            fragment.dismiss();
        }
    }

3.在宿主Fragment打开DialogFragment的入口处设置监听。

login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragment= new LoginDailogFragment();
                fragment.setTargetFragment(MainFragment.this, REQUEST_CODE);
                fragment.show(getFragmentManager(), "login");
            }
        });

完整代码:

package com.fantasychong.dialogfragmentlogin2;

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainFragment extends Fragment {

    public static final int REQUEST_CODE = 1;

    private Button login;
    private TextView name;
    private TextView password;
    private LoginDailogFragment fragment;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view= LayoutInflater.from(getActivity()).inflate(R.layout.fragment_main, container, false);
        login= view.findViewById(R.id.main_login);
        name= view.findViewById(R.id.main_name);
        password= view.findViewById(R.id.main_password);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragment= new LoginDailogFragment();
                fragment.setTargetFragment(MainFragment.this, REQUEST_CODE);
                fragment.show(getFragmentManager(), "login");
            }
        });
        return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode== REQUEST_CODE){
            String userName= data.getStringExtra(LoginDailogFragment.USERNAME);
            String userPassword= data.getStringExtra(LoginDailogFragment.USERPASSWORD);
            name.setText(userName);
            password.setText(userPassword);
            fragment.dismiss();
        }
    }
}

至此全部完成,我们可以看到无论是宿主Activity还是宿主Fragment都可以接收到DialogFragment回调过来的参数,我们根据实际开发需求去选取即可。

源码下载:点击打开链接

2012-05-24 16:52:43 xinke87 阅读数 1018
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19238 人正在学习 去看看 任苹蜻

IT168评论】尽管目前Android智能手机占据了半壁江山,但是对于Android开发者来说却并没有形成很好的盈利模式,这很大程度上得益于Android平台的开放和混乱,这些姑且先不说。Android开发者很多都考免费应用+广告模式生存,试问,当这种连生存都难以保证的时候是不是要进行反抗?

  今天从一个ANdroid开发者哪里获得了心声,其原因是一篇《360副总裁李涛:360对流氓软件行为绝不会姑息》的文章,让Android开发者收到了巨大的损失,发表了以下的言论:

  " 我觉得很气愤,我不管360你认为自己是什么角色,认为内置广告的应用是什么角色,你厉害,你把所有广告都拦截了,试问下,你让苦逼的android程序员怎么活?

  你在新闻里说的很明白,应用弹广告,用户点击,得到的钱广告平台与开发者分,我就想说程序员也需要养家,程序员也是人,中国的市场这样大家一目了然,在android上很少有人花钱买应用,好不容易可以内置广告挣几毛钱,你赶尽杀绝了,你爽了,用户大人也爽了,程序员SB了,家破人亡。你让以后谁来开发程序?360你把所有程序都自己开发吧,谢谢你。

  我知道有一些应用确实内置的广告,弹的很频繁,麻烦你做下调研好么?很多广告平台都限制广告条数,就是为了能最大限度的不影响用户。

  我在这里撩一句狠话,360如果不加限制的就屏蔽任意应用广告,中国android开发程序员必亡,在这里我也不否认360的影响度。还有,你随便就通过底层拦截破坏其他应用正常运行,你属于破解,你是在作恶。

  我们程序开发出来内置广告,用户同意下载就表明愿意用以接收广告方式有偿使用我们的程序,你凭什么屏蔽,这样谁才是最大的恶意软件,病毒。

  360你方便了很多人,谢谢你,但是希望你不要自大。

  署名:一个需要养家的有良心的苦逼android开发工程师"

  第一职业网认为,Android开发被很多从事开发职业的朋友所向往,其实,很理解这位开发者朋友的心情,当自己辛辛苦苦做的应用程序因为某些原因不能给自己带来收益甚至是让自己面临被饿死的情况下,这种勇敢的向360挑战的心情值得大家同情。毕竟在中国有非常多的应用开发者都是靠免费的应用+弹窗广告程序养活,既然广告提供商已经在用户端做好了充分的调研,掌握了用户的接收习惯,那么这种合理性是可以被用户接受的。360的这种不顾开发者生存,肃清一切弹窗广告的做法实在有点过头。文章来自:http://www.d1zhiye.com/article-61-1.html 

广告活动弹窗

阅读数 1189

android悬浮窗口的实现

阅读数 171367

android模块化开发

阅读数 10

没有更多推荐了,返回首页