当前位置:  ▪Android录音应用实例教程 iis7站长之家
本页文章导读:
    ▪apns批量运用失败        apns批量使用失败   突然某一天app 调用 apns 用户莫名其妙收不到,由于调用的是底层的统计接口,不知道是自己的问题还是水果的 问题,好吧,自己裸调水果接口。   用pip 搜索了一下 pytho.........
    ▪ 水波纹效果兑现        水波纹效果实现 水波纹效果实现先看下效果图:[img][/img]点击图片后效果:[img][/img]工程结构图:[img][/img]AnimActivity:/* * Copyright (C) 2010 Zhang YangJing * * zhangyangjing@gmail.com * */ package com.exa.........
    ▪ 自定义通报与系统通知的学习       自定义通知与系统通知的学习 自定义通知与系统通知的学习通知这块比较简单,代码不多[img][/img]工程结构图:[img][/img]NotificationDemoActivity:package com.amaker.notification; import android.app.Activity;.........

[1]apns批量运用失败
    来源: 互联网  发布时间: 2014-02-18
apns批量使用失败

 

突然某一天app 调用 apns 用户莫名其妙收不到,由于调用的是底层的统计接口,不知道是自己的问题还是水果的

问题,好吧,自己裸调水果接口。

 

用pip 搜索了一下 python 的包,撞了 pyapns  和 apns  发现 apns 貌似比较成熟一些,还包含了feedback的

调用,试这调用发现没有问题,虽然有些延迟但是,基本上不会失败。接着底层接口的同事过来调试。我发他debug。

发现每次调用都记录下来的,好吧那就是水果没给发了,看了好多网上的文档都感觉不靠谱,还是自己去读一遍水果

的官方文档吧,的吧的吧的看了一统,发现一些有用约定

 

 

 

我看了苹果关于 push 这块的文档,有用的就是这些

 

You should also retain connections with APNs across multiple notifications. APNs may consider connections that are rapidly and repeatedly established and torn down as a denial-of-service attack. Upon error, APNs closes the connection on which the error occurred.

As a provider, you are responsible for the following aspects of push notifications:

  • You must compose the notification payload (see “The Notification Payload”).
  • You are responsible for supplying the badge number to be displayed on the application icon.
  • You should regularly connect with the feedback web server and fetch the current list of those devices that have repeatedly reported failed-delivery attempts. Then you should cease sending notifications to the devices associated with those applications. See “The Feedback Service” for more information.

 

苹果建议对多个notification 保持连接,反而对频繁的建立和断开,会被认为 dos 攻击。

 

看样子水果是让一次连接,多次发送的,那为什么我们批量发送push 会失败呢。找来3台ios设备,反复push。

最后发现,如果中间有一个非法的token,则之后的所有notification 都发送不出去。

 

这可能和水果的审核机制有关,一次连接,批量发送push,中间有非法的token,苹果就做强烈的处理,停止发送了。

 


    
[2] 水波纹效果兑现
    来源: 互联网  发布时间: 2014-02-18
水波纹效果实现
水波纹效果实现

先看下效果图:
[img]

[/img]

点击图片后效果:
[img]

[/img]

工程结构图:
[img]

[/img]

AnimActivity:
/*
 * Copyright (C) 2010 Zhang YangJing
 * 
 * zhangyangjing@gmail.com
 * 
 */

package com.example.plasma;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;


public class AnimActivity extends Activity {
	@Override
    public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(new PlasmaView(this));
	}
}

class PlasmaView extends View implements View.OnTouchListener{	
	private Bitmap mBitmap;
	long time;
	long fps;

    public PlasmaView(Context context) {
        super(context);        
        Bitmap bmp = BitmapFactory.decodeResource(this.getResources(),R.drawable.mm);
        mBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.RGB_565);
        AnimRender.setBitmap(bmp);
        this.setOnTouchListener(this);
    }

    @Override 
    protected void onDraw(Canvas canvas) {
    	long ct = System.currentTimeMillis();
    	if(ct - time > 1000){
    		Log.v("Fps:" + String.valueOf(fps));
    		time = ct;
    		fps = 0;
    	}
    	//fps++;
    	fps += 20;
    	
        AnimRender.render(mBitmap);    	
        canvas.drawBitmap(mBitmap, 0, 0, null);
        postInvalidate();
    }

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		AnimRender.drop((int)event.getX(), (int)event.getY(), 1200);
		return false;
	}
}

class AnimRender{
	public static native void setBitmap(Bitmap src);
    public static native void render(Bitmap dst);
    public static native void drop(int x, int y, int height);
   
    static {
        System.loadLibrary("plasma");
    }
}


log
package com.example.plasma;

import android.util.Config;

public class Log {
	public final static String LOGTAG = "ad";

	private static final boolean DEBUG = true;
	//private static final boolean DEBUG = false;
	static final boolean LOGV = DEBUG ? Config.LOGD : Config.LOGV;

	public static void v(String msg) {
		if (LOGV) {
			android.util.Log.v(LOGTAG, msg);
		}
	}

	public static void e(String msg) {
		android.util.Log.e(LOGTAG, msg);
	}
	
	public static void d(String msg) {
		android.util.Log.d(LOGTAG, msg);
	}
}


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="fill_parent"
    android:layout_height="fill_parent"
    >
<cn.zyj.water.AnimSurface
 	android:id="@+id/surfaceview"	
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    />
</LinearLayout>


配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.plasma"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AnimActivity"
        		  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

	<uses-sdk android:minSdkVersion="4"/>
</manifest> 

    
[3] 自定义通报与系统通知的学习
    来源: 互联网  发布时间: 2014-02-18
自定义通知与系统通知的学习
自定义通知与系统通知的学习

通知这块比较简单,代码不多
[img]

[/img]

工程结构图:
[img]

[/img]

NotificationDemoActivity:
package com.amaker.notification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**  
 * @Title: NotificationDemoActivity.java
 * @Package com.amaker.notification
 * @Description: 通知控制类
 * @author ZZL
 */
public class NotificationDemoActivity extends Activity {
	
	private Button clearBtn ;
	private NotificationManager manager ;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    
    /**
     * 初始化方法实现
     */
    private void init(){
    	
    	//步骤一:取得系统服务
    	manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    	
    	//步骤二:
    	Notification notification = new Notification(R.drawable.notification,
    			"收到小马通知测试", System.currentTimeMillis());
    	
    	/**
    	 * 小马在这个地方写下为什么要在用到通知的时候要创建PendingIntent对象,是因为
    	 * Notification可以与应用程序脱离,即便应用程序关闭,Notification仍然
    	 * 会显示在状态栏中,当应用程序再次启动后,又可以重新控制这些Nofication消息,
    	 * 如清除或替换它们,因为才创建的此对象,更神奇的是这个对象由安卓系统本身维护哦,所以
    	 * 在应用关闭后这个对象是不会被翻译掉的
    	 */
    	//步骤三:
    	Intent intent = new Intent();
    	intent.putExtra("Msg", "这是从Notification传递过来的信息");
    	intent.setClass(this, NotificationDemoTest.class);
    	PendingIntent contentIntent = PendingIntent.getActivity(this, 0,intent, 0);
    	
    	//步骤四:setLatestEventInfo通过标准的方式将我们的通知设置到指定的View中
    	notification.setLatestEventInfo(this, "通知测试哦", "这是通知的主内容", contentIntent);
    	
    	//写下面这句话的时候大家注意下不要忘了加震动权限,不然没法调用硬件
    	//notification.defaults = Notification.DEFAULT_VIBRATE;
    	//下面这句是把当前的通知设置永久保存的Notification,好暴力呀,吼吼
    	//notification.flags = Notification.FLAG_NO_CLEAR
    	//下面这句是指:如果要让其它的软件检测到永久保存的通知时可以这样写
    	//Notification.flags = Nofication.FLAG_ONGOING_EVENT;
    	/**
    	 * 在这一步需要指定标识Notification的唯一ID,这个ID必须相对于同一个
    	 * NoficationManager对象是唯一的,否则就会覆盖相同ID的Notification
    	 */
    	//步骤五:
    	manager.notify(R.drawable.notification, notification);
    	
    	clearBtn = (Button)findViewById(R.id.button1);
    	clearBtn.setOnClickListener(new OnClickListener() {
    		
    		@Override
    		public void onClick(View v) {
    			manager.cancel(R.drawable.notification);
    			//清除所有通知:
    			//manager.cancelAll();
    		}
    	});
    	
    }
    
}


NotificationDemoTest
package com.amaker.notification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.Toast;

/**  
* @Title: NotificationDemoTest.java
* @Package com.xiaoma.www.demo
* @Description: 接收并弹出通知传递过来的信息
* @author MZH
*/
public class NotificationDemoTest extends Activity {
	//声明变量
	private Button selfBtn;
	
	private NotificationManager manager ;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.maintwo);
		init();
	}
	
	/**
	 * 初始化方法实现
	 */
	private void init(){
		Intent i = this.getIntent();
		String msg = i.getStringExtra("Msg");
		if(!"".equals(msg)){
			Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
		}else{
			Toast.makeText(this, "未接收到任何短信", Toast.LENGTH_SHORT).show();
		}
		
		selfBtn = (Button)findViewById(R.id.button2);
		selfBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				sendNotification();
			}
		});
		
	}
	private void sendNotification(){
		/**
		 * 下面还是五个步骤,呵呵跟前面那个Activity是一样的,只是通知布局不同咯,用RemoteViews加载
		 */
		manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
		Notification notification = new Notification(R.drawable.ic_launcher,
				"这是自定义通知的信息哦", System.currentTimeMillis());
		PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, getIntent(), 1);
		/**
		 * RemoteViews这个类的官方文档解释为:
		 *   很直接很简单的讲就是:从我们自己的XML文件中加载一个VIEW到通知中   
		 */
		RemoteViews rViews = new RemoteViews(getPackageName(), R.layout.notification);
		rViews.setTextViewText(R.id.textView, "更新自定义内容");
		notification.contentView = rViews;
		notification.contentIntent = pendingIntent;
		//notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的正文", pendingIntent);
		manager.notify(1, notification);
		
	}
	

}


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/background" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:text="清队当前通知" />

</LinearLayout>


maintwo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@drawable/background"
    >

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点我查看自定义通知"
        android:textColor="#000000" />

</LinearLayout>


notification.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="自定义内容"
        android:textColor="#F00"
        android:textSize="20px"
        android:gravity="center"
        android:id="@+id/textView"
         />

    <ImageButton
        android:id="@+id/imageBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="/blog_article/@drawable/notification/index.html"/>

</LinearLayout>


配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amaker.notification"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/xiaoma"
        android:label="@string/app_name" >
        <activity
            android:name=".NotificationDemoActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NotificationDemoTest"></activity>
    </application>

</manifest>

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3